我不明白递归

时间:2013-07-19 11:34:52

标签: python recursion

我可以理解简单的递归,例如:

def count(n):
    if n <= 0:
        return
    else:
        print n
        count(n-1)

count(3)

然而,当面对更复杂的代码时,例如,Koch雪花的实现:

def koch(order, size):
    if order == 0:
            t.forward(size)
    else:
            koch(order-1, size/3)
            t.left(60)
            koch(order-1, size/3)
            t.right(120)
            koch(order-1, size/3)
            t.left(60)
            koch(order-1, size/3)

koch(1, 100)

我感到困惑。我不明白如何遵循这些多个递归函数调用。

6 个答案:

答案 0 :(得分:2)

我认为任何人都不容易在头脑中详细可视化执行路径。使用表示各个递归调用的节点绘制树是在纸上可视化的好方法。如果每个节点都是一个气泡,您可以在其中放置有关变量状态等的信息。在存在多个递归调用的情况下,每个节点下面都会有多个树,表示时间轴。

答案 1 :(得分:2)

您的Koch雪花示例很好。雪花是由什么组成的?在第一次迭代(order == 0)中,它从一个简单的行开始。这是基本情况。

________

现在,对于下一级递归(order == 1),该基本情况被分成四个子行,形成一个倒置的V。要实现此V,您需要以适当的角度构建四条线(您需要t.left(60)和类似的命令)。

这些行中的每一行(自己都认为)是基本情况的一个实例。它只有三倍。这就是你在koch(order-1, size/3)中看到的内容。

   /\
__/  \__

现在想象下一级递归 - 每一行再次分成四个子行。模式继续......

答案 2 :(得分:2)

对于koch(1,100),它看起来像这样:

koch(1, 100)
->
    koch(0, 33)
      order == 1, so stop recursing down this branch
    <-
    t goes left
    koch(0, 33)
      order == 1, so stop recursing down this branch
    <-
    t goes right
    koch(0, 33)
      order == 1, so stop recursing down this branch
    <-
    t goes left
    koch(0, 33)
      order == 1, so stop recursing down this branch
    <-
<-
done

对于koch(2,100),对koch的第一次调用将扩展到上面,

koch(2, 100)
->
    koch(1, 100)
    ->
        koch(0, 33)
          order == 1, so stop recursing down this branch
        <-
        t goes left
        ...
    ...
    t goes left
    ...

尝试按照建议在纸上进行追踪。你最终会得到像树一样的结构。

答案 3 :(得分:1)

尝试一下以下内容:

def koch(order, size):
    print 'koch(', order, size, ')'
    if order == 0:
            t.forward(size)
            print 'Got to the bottom of it'
    else:
            koch(order-1, size/3)
            t.left(60)
            koch(order-1, size/3)
            t.right(120)
            koch(order-1, size/3)
            t.left(60)
            koch(order-1, size/3)

koch(1, 10)

你应该看看每个电话如何调用koch,直到它最终到达链的底部。

答案 4 :(得分:1)

python导师网站可以帮助可视化程序流程 http://www.pythontutor.com/

答案 5 :(得分:0)

要了解代码,有助于了解创建koch雪花的第一步。在每个递归步骤中,您都有一个三角形,代码覆盖另一个。现在你有了调用代码的新三角形 - 一切从头开始。