【问题标题】:Understanding recursion in Python 2 (Think Python, exercise 5)理解 Python 2 中的递归(思考 Python,练习 5)
【发布时间】:2016-10-11 18:00:04
【问题描述】:

我正在学习 Think Python,我已经达到了递归,这让我很难理解。

There's this exercise,第 5 号,向我展示了这段代码:

def draw(t, length, n):
    if n == 0:
        return
    angle = 50            #sets angle
    fd(t, length*n)       #make a turtle() "t" go forward length*n pixels while drawing
    lt(t, angle)          #makes turtle "t" turn left on itself "angle" (50) degrees
    draw(t, length, n-1)  #1st call
    rt(t, 2*angle)        #makes turtle "t" turn right "2*angle" (100) degrees
    draw(t, length, n-1)  #2nd call
    lt(t, angle)          #makes turtle "t" turn left "angle" (50) degrees
    bk(t, length*n)       #makes turtle "t" go backwards length*n pixels

并要求我考虑它的作用,然后运行它。我运行了它,但我无法理解它为什么会这样做。 这是一个更复杂的递归案例,书籍用于解释这个设备,我无法理解。 为了理解这个问题的一个简单实例,让我们将 n 设为示例 2: 我可以弄清楚的是,代码在 n=0 之前连续调用自己直到第一次调用,然后将控件返回到 n=1 并使剩余的代码行从调用 1 到调用 2。它使用第二次调用n=0 并返回,但我无法理解它返回程序控制的函数实例。 如果有人能指出我正确的方向,我会很高兴如何自己思考这种递归代码,我如何利用它(当 for 语句不能完全实现时)以及一种模式化的方法它的工作方式(例如,使用某种图表?)。 我有这个:

function called with n=2
 function called with n=1
  function called with n=0; returns to:
 function called with n=1 makes the 2nd call to the function with n=0
  function called with n=0; returns to where?
??????

如您所见,这对于 n = 7 的函数调用是非常不切实际的。

【问题讨论】:

    标签: python algorithm recursion


    【解决方案1】:

    函数总是直接返回给它的调用者。你的递归函数做了一些工作,调用自己,然后当调用返回时,做一些更多的工作,然后调用自己另一个时间,然后当它返回时,在函数结束和自身之前做一些最终的工作返回:

    work
    call
    work
    call
    work
    return
    

    也就是说,除非n == 0 为真,否则函数会立即返回。每个递归调用都会从 n 中减去 1,因此只要 n 开始时是肯定的,您的递归就会在某个点结束。

    递归只是再次运行相同函数的行为,因此您可以将上述“图表”中的每个call 替换为正在执行的相同作业。让我们这样做一次:

    n = 2
    work
        n = 1
        work
        call
        work
        call
        work
    work
        n = 1
        work
        call
        work
        call
        work
        return
    work
    return
    

    我已经添加了n 的值,前提是我们以n = 2 开头。当然,一旦你下到n = 0,电话会立即返回;我们也可以填写:

    n = 2
    work
        n = 1
        work
            n = 0
            return
        work
            n = 0
            return
        work
        return
    work
        n = 1
        work
            n = 0
            return
        work
            n = 0
            return
        work
        return
    work
    return
    

    现在我们有了递归函数的完整调用树,n = 2。对于更高的n 值,只需在上一级有call 行的任何地方继续缩进并填写work - call - work - call - work - return 行,您就可以为任何递归函数构建完整的调用树。

    【讨论】:

      【解决方案2】:

      所以我遇到了同样的问题来理解这个练习,我认为没有什么比模式或图片更容易理解它了,所以这是我对代码第一次迭代的解释(使用相同的逻辑你会很容易理解其余的代码):

      【讨论】:

        猜你喜欢
        • 2017-02-10
        • 2015-02-22
        • 2017-11-12
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 2012-07-02
        • 2011-05-25
        相关资源
        最近更新 更多