注:本文如涉及到代码,均经过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.