在纸上追踪递归函数

时间:2013-10-29 19:58:05

标签: python recursion language-agnostic

我现在正在学习递归,正如俗话所说,精通递归的最佳方法是尽可能多地练习。我习惯用纸张跟踪程序(我想我们所有人都曾在某些方面)。

例如,如果我有一个从1到10打印数字的功能:

def print_n():
    for i in range(1,11):
        print i

我会跟踪:

i
.......
1
2
3
4
... and so on

但是当我练习递归时,我发现很难用纸张跟踪程序。有人可以通过示例推荐一种在纸上跟踪递归函数的最佳方法吗? 您可以使用以下斐波纳契(再次!!!)来说明您的示例,或者您可能会惊讶于读者。

#RECURSIVE FUNCTION TO RETURN Nth FIBONACCI NUMBER
def fib(n):
    if n is 0 or n is 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

4 个答案:

答案 0 :(得分:6)

把这个答案放在这里。在我的开发中,我经常使用调试器,他们也帮助了我很多。因此,我建议这样做,因为它们通常比在递归深度上打印字符串更有帮助。

当我想跟踪一个递归函数(只写一个递归回答here)时,我会做什么,就是我将断点设置为特定点。

理想情况下,大多数调试器将允许您查看与当前作用域相关的值列表,并允许您step into函数调用以查看其运行方式。

我通常做的是创建一个对我很重要的变量的监视列表。我当时所做的是创建一个函数调用图。与本网站上为example创建的图表非常相似。

enter image description here

处理递归的最佳方法是使用捆绑了笔和纸的调试器。或者,如果您的调试器支持静态监视列表,那么您有时甚至不需要这样做。但是,我想说在开始时,最好用笔和纸来描绘事物,因为它可以让你更好地理解你的程序是如何工作的。有时,人们只是使用递归并期望计算机为他们解决问题,然而,这非常棒,你必须知道你的递归是如何工作的,并且为了那个(对于初学者)笔和纸是你最好的工具。

答案 1 :(得分:5)

以下是我可能会将其写在纸上,fib(5)如下所示:

                                          fib(5)
                       fib(4)               +                  fib(3)
              fib(3)     +      fib(2)      +         fib(2)     +   fib(1)   
     fib(2)     + fib(1) + fib(1) + fib(0)  +    fib(1) + fib(0) +     1
fib(1) + fib(0) +   1    +   1    +   1     +      1    +   1    +     1
  1    +   1    +   1    +   1    +   1     +      1    +   1    +     1

答案 2 :(得分:3)

让电脑为您做繁重的工作!通过添加几行,您可以看到函数如何以递归方式进行潜水:

def fib(n,depth=0):
    print ''.join(["*"]*depth), n

    if n is 0 or n is 1:
        return 1
    else:
        return fib(n-1,depth+1) + fib(n-2,depth+1)

fib(5)

给出:

 5
* 4
** 3
*** 2
**** 1
**** 0
*** 1
** 2
*** 1
*** 0
* 3
** 2
*** 1
*** 0
** 1

请注意,我们现在正在跟踪n的深度。在这种情况下,很容易看出depthn是如何相关的,但在其他情况下,它可能不那么明显,所以这个练习并不完全是学术性的。我们通过行depth打印出''.join(["*"]*depth)的可视化表示,它只是创建了一个*的字符串,其深度相同。

答案 3 :(得分:3)

会是这样的:

fib(3)
 n=3 so return fib(2) + fib(1)

So now we need fib(2) and fib (1)

   fib(2)
    n =2 so return fib(1)+fib(0)
    fib (1)
     n=1 so return 1

    fib (0) 
     n=0 so return 1

    Now we can have fib(2) return 1+1 = 2. We still need to do fib(1) to return the value of fib(3)

    fib(1)
     n=1 so return 1

Now we can return fib(3)'s value of 2+1=3
相关问题