2017-10-19 125 views
0

该任务要求编写打印Sierpinski三角形的程序。 期望的结果是这样的:打印Sierpinski三角形

# 
## 
# # 
#### 
# # 
## ## 
# # # # 
######## 
#  # 
##  ## 
# #  # # 
#### #### 
# # # # 
## ## ## ## 
# # # # # # # # 
################ 
#    # 
##    ## 
# #    # # 
####   #### 
# #   # # 
## ##   ## ## 
# # # #   # # # # 
########  ######## 
#  #  #  # 
##  ##  ##  ## 
# #  # #  # #  # # 
#### #### #### #### 
# # # # # # # # 
## ## ## ## ## ## ## ## 
# # # # # # # # # # # # # # # # 
################################ 

这是我的尝试:

declare 
v_str varchar2(10) := '#'; 
n NUMBER := 4; 
begin 
    for i in 1..n loop 
     v_str := rpad(v_str, i, '#'); 
     for l in 1..8 loop 
     v_str := rpad(v_str, l, v_str); 
     dbms_output.put_line(v_str); 
     end loop; 
    end loop; 
end; 

正如你所看到的,我没有得到预期的结果,我想。问题是我不知道要在三角形内留出空位。我的想法是做一个变量,其中包含此:

# 
## 
# # 
#### 

然后把它放在1..8循环。我在代码中写下了一些麻烦。任何建议/提示?谢谢!

+0

你提出了一个类似的问题已经在这里:https://stackoverflow.com/questions/46728915/printing-an-alphabet-pyramid-in-pl-sql - 看起来你有相当“特殊”的老师......你的老师是否喜欢你学习编程PL/SQL或算法? –

+0

嗨@WernfriedDomscheit。我的老师正在教我PL/SQL和数据库。刚刚两周前开始跟他学习,但他提出了很多棘手的问题。 – Chopsticks

回答

3

你可以做到这一点使用this code

DECLARE 
    n PLS_INTEGER := 4; 
BEGIN 
    FOR line IN REVERSE 0 .. POWER(2, n) - 1 LOOP 
    FOR col IN 0 .. POWER(2, n) - 1 LOOP 
     IF BITAND(line, col) = 0 THEN 
     DBMS_OUTPUT.PUT('#'); 
     ELSE 
     DBMS_OUTPUT.PUT(' '); 
     END IF; 
    END LOOP; 
    DBMS_OUTPUT.NEW_LINE; 
    END LOOP; 
END; 
/
+0

奇怪。 Toad和sql开发人员的不同输出。 –

+0

@KaushikNayak复制/粘贴第二个循环,我错误地没有删除'REVERSE',它正在输出右对齐的三角形(带有空白)。我相信[某些版本的Toad会从DBMS_OUTPUT中删除前导空白](https://www.toadworld.com/products/toad-for-oracle/toad_for_oracle_beta_program/f/86/t/25049),但SQL开发人员不会会给你不同之处。正确的版本(没有第二个'REVERSE')在两个版本中都应该是相同的(左对齐),因为它没有前导空格。 – MT0

+0

嗨,谢谢你的回答。很抱歉再次打扰你,但你能解释第四和第五行吗? – Chopsticks