递归调用如何工作(sierpinski三角形)?

时间:2013-08-11 23:22:32

标签: python recursion

我遇到了一个用递归绘制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)

3 个答案:

答案 0 :(得分:3)

这是递归的工作原理:有一个基本情况,并且有一个递归情况。由于递归使用LIFO结构(例如调用堆栈),我们必须知道何时停止向堆栈添加调用。

基本案例:

  • n == 0
  • 时发生
  • 执行实际绘图操作
  • 表示不再生成三角形,因此可以开始绘制它们。

递归案例:

  • n > 0(严格来说,n < 0
  • 时发生
  • 对自身进行三次不同的调用,每次调用x1,x2,y1和y2都有不同的值。
  • 表示还有更多三角形要生成。

这样想。要绘制的三角形数量由此公式T给出:

T of x = 3 to the n if n is greater than 0, 0 otherwise.

这适用于简单的三角形:如果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 次。