我遇到了一个用递归绘制Sierpinski三角形的程序。 我如何解释这个代码是调用sierpinski1直到n == 0,然后才会绘制3个小三角形(每次调用一个三角形),因为n == 0是绘制某些东西的唯一情况(panel.canvas.create_polygon) 。但是,这不是代码的工作方式,因为在运行时会绘制依赖于n的三角形数量,而不仅仅是我想要显示的3个小三角形。
有人可以向我解释当函数sierpinski1只有1个条件可以绘制时,可以绘制多少东西?这是我无法理解的程序的一部分。我在递归时查找了所有可能的内容,但没有任何信息可以解释为什么这种递归格式有效。
def sierpinski(n):
x1 = 250
y1 = 120
x2 = 400
y2 = 380
x3 = 100
y3 = 380
panel = DrawingPanel(500,500)
sierpinski1(n,x1,y1,x2,y2,x3,y3,panel)
def sierpinski1(n,x1,y1,x2,y2,x3,y3,panel):
if n == 0:
panel.canvas.create_polygon(x1,y1,x2,y2,x3,y3, fill = 'yellow', outline = 'black')
else:
sierpinski1(n-1,x1,y1,(x1+x2)/2,(y1+y2)/2,(x1+x3)/2,(y1+y3)/2, panel)
sierpinski1(n-1,(x1+x3)/2,(y1+y3)/2,(x2+x3)/2,(y2+y3)/2,x3,y3,panel)
sierpinski1(n-1,(x1+x2)/2,(y1+y2)/2,x2,y2,(x2+x3)/2,(y2+y3)/2,panel)
答案 0 :(得分:3)
这是递归的工作原理:有一个基本情况,并且有一个递归情况。由于递归使用LIFO结构(例如调用堆栈),我们必须知道何时停止向堆栈添加调用。
基本案例:
n == 0
递归案例:
n > 0
(严格来说,n < 0
)这样想。要绘制的三角形数量由此公式T给出:
这适用于简单的三角形:如果n = 1,则只绘制三个三角形。如果n = 2,则绘制9,依此类推。
为什么会有效? 调用堆栈在此中发挥了重要作用。
为简洁起见,这里有一个n = 1的痕迹:
sierpinski1(n,x1,y1,x2,y2,x3,y3,panel)
condition n = 0 FAILS
sierpinski1(n-1,x1,y1,(x1+x2)/2,(y1+y2)/2,(x1+x3)/2,(y1+y3)/2, panel)
condition n = 0 PASSES
panel.canvas.create_polygon(x1,y1,x2,y2,x3,y3, fill = 'yellow', outline = 'black')
sierpinski1(n-1,(x1+x3)/2,(y1+y3)/2,(x2+x3)/2,(y2+y3)/2,x3,y3,panel)
condition n = 0 PASSES
panel.canvas.create_polygon(x1,y1,x2,y2,x3,y3, fill = 'yellow', outline = 'black')
sierpinski1(n-1,(x1+x2)/2,(y1+y2)/2,x2,y2,(x2+x3)/2,(y2+y3)/2,panel)
condition n = 0 PASSES
panel.canvas.create_polygon(x1,y1,x2,y2,x3,y3, fill = 'yellow', outline = 'black')
因此,对于n = 1,正好绘制了三条线。对于n
的更高值,在伪代码高级别上看起来更棘手,但同样的原则适用。
答案 1 :(得分:1)
当n = 0时才会绘制东西,但是如果用n = 1调用它,那么在n = 0的情况下对它进行三次单独的调用。同样,如果用n = 2调用它,则三次调用是在n = 1的情况下对其进行调整,每次调用n = 0,总共9个绘图。通常,当调用次数乘以每层三次时,用n调用时会绘制3 ^ n个小三角形。
答案 2 :(得分:1)
有人可以向我解释当有多少东西时可以画出来 函数sierpinski1只有一个条件可用于何时可以 绘制?
因为该函数在每个非零步骤进行三次递归调用。这意味着对于大于0的每个n
,函数分支为三个不同的路径,其n
的值小于1.您将最终达到n=0
的总数<强> 3 n 次。