2017-10-19 114 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