注:本文如涉及到代碼,均經過Python 3.7實際運行檢驗,保證其嚴謹性。
本文閱讀時間約為7分鐘。
遞歸編程練習題3:ASCII謝爾賓斯基地毯
謝爾賓斯基地毯
謝爾賓斯基地毯是形如上圖的正方形分形圖案,每個地毯可分為等大小的9份,其中中央挖空,其余均由更小的地毯組成。
現給定地毯大小(行數)與組成地毯的字符元素,請打印相應的地毯圖形。
注:空腔以半角空格表示;當給定字符元素長度不為1時空格數須與字符長度對應。
輸入格式:
輸入為兩行,分別為地毯的邊長,即組成地毯的元素的個數——正整數N,以及組成地毯的元素——字符串c。
輸入數據保證N為3的正整數冪。
輸出格式:
由N行長度為N*len(c)的字符串構成的謝爾賓斯基地毯。
輸入樣例:
9
[]
輸出樣例:
[][][][][][][][][]
[] [][] [][] []
[][][][][][][][][]
[][][] [][][]
[] [] [] []
[][][] [][][]
[][][][][][][][][]
[] [][] [][] []
[][][][][][][][][]
參考程序模板:
def carpet(N,char):
# code here
pass
n=int(input())
c=input()
carpet(n,c)
解答:這里主要是用遞歸解決問題。關鍵在于對于一個最小的條件來說,哪里填充空格符(即挖空),哪里填充字符串c。
我們可以通過設定坐標系及坐標(x, y)一樣的東西來精準控制何處該填充空格符還是字符串c。
拿下面最簡單的一個3 * 3的謝爾賓斯基地毯來說,坐標(x, y)可以精確表示途中任意一處。例如當x = 0,y = 0時,即坐標(0, 0)表示左上角第一個'[]',而坐標(1, 1)則表示謝爾賓斯基地毯挖空的那個部分,也就是填充了空格符的那一個位置。
[][][]
[] []
[][][]
那么,如何在程序中實現(x, y)坐標的模擬呢?雙重for循環就是我們要找的工具:
for x in range(N):
for y in range(N):
最后,別忘了換行符'\n'的使用。
參考代碼及詳細注釋如下:
def carpet(N, c):
# 以x,y為坐標點,來判斷什么坐標位置填充字符串c以及什么位置填充空格符(即挖空)。
def judge(n, x, y):
if n == 1:
return True # 符合True條件的(x, y)坐標點填充字符串c。
n1 = n // 3
if n1 <= x < n1 * 2 and n1 <= y < n1 * 2:
return False # 符合False條件的(x, y)坐標點填充空格符。
return judge(n1, x % n1, y % n1) # 遞歸繼續判斷,直到滿足基本結束條件為止。
d = '' # 創建一個變量d,用來展示最后完成的謝爾賓斯基地毯。字符串形式。
for x in range(N):
for y in range(N):
if judge(N, x, y):
d += c
else:
d += (len(c) * ' ')
d = d + '\n' # 這里有個換行符。
return d
N = int(input())
c = input()
print(carpet(N, c))
<<<
9
()
()()()()()()()()()
() ()() ()() ()
()()()()()()()()()
()()() ()()()
() () () ()
()()() ()()()
()()()()()()()()()
() ()() ()() ()
()()()()()()()()()
<<<
To be continued.