python - 在论文中跟踪递归函数

标签 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)

最佳答案

只是把这个答案扔在这里。在我的开发中,我经常使用调试器,它们也帮了我很多。所以,我推荐这样做,因为它们通常比仅在递归深度上打印出字符串更有帮助。

当我想跟踪一个递归函数(刚刚写了一个递归答案 here )时,我会做的是将断点设置为特定点。

理想情况下,大多数调试器将允许您查看与当前范围相关的值列表,并允许您进入一个函数调用以查看它是如何运行的。

我通常做的是创建一个对我很重要的变量的观察列表。然后我要做的是创建一个函数调用图。与本网站上创建的图表非常相似,example .

enter image description here

我处理递归的最佳方法是使用与笔和纸捆绑在一起的调试器。或者,如果您的调试器支持静态监视列表,那么您有时甚至不需要这样做。不过,我想说的是,一开始最好用笔和纸勾勒出草图,因为它能让你更好地了解你的程序是如何工作的。有时,人们只是使用递归并期望计算机为他们解决问题,这很棒,但是,您必须知道您的递归是如何工作的,并且(对于初学者)笔和纸张是您最好的工具。

关于python - 在论文中跟踪递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19667925/

相关文章:

c# - ASCII + Numpad 组合为 power 10

algorithm - 是否有用于反转单链表的 O(n log(n)) 算法?

python - 在 python scrapy 中选择所有具有特定 id 模式的元素

python - 如何模式匹配和更改表达式中所有出现的子表达式?

python - 如何标注图中每条线的最高点?

c - 执行算法递归求小数,速度很慢

python - scikit-learn ExtraTreesClassifier - 为什么 pickle 文件如此巨大? (几GB)

algorithm - 有人可以通过代码描述一个用迭代而不是递归回溯的实际例子吗?

c - 99瓶啤酒递归好像不行

language-agnostic - 使用示例解决方案进行编码练习