无法理解Python 2.7中的阶乘的经典递归示例
发布时间:2020-12-20 11:37:06 所属栏目:Python 来源:网络整理
导读:我理解递归的概念,我感到困惑的是流量控制.我看到过这种方式有两种,一种是我得到的,另一种是我没有的.例一: def fact(n): if n == 0: return 1 else: return n * fact(n-1) 所以在这个例子中,如果我们运行fact(3),会发生以下情况: fact(3) = 3*fact(3-1)`f
我理解递归的概念,我感到困惑的是流量控制.我看到过这种方式有两种,一种是我得到的,另一种是我没有的.例一:
def fact(n): if n == 0: return 1 else: return n * fact(n-1) 所以在这个例子中,如果我们运行fact(3),会发生以下情况: fact(3) = 3*fact(3-1)` fact(2) = 2*fact(2-1) fact(1) = 1*fact(1-1) fact(0) = 1 或组合:3 * 2 * 1 * 1 = 6 现在,对于下面的内容,我被绊倒的地方在于流量控制的工作原理.我在脑海中根深蒂固,当一个函数被调用时,其他一切都被暂停,直到该函数完成,此时程序返回到main.以下是我的大脑认为发生在下面的事情: def factorial(n): if n == 0: return 1 else: recurse = factorial(n-1) result = n * recurse return result 我们称之为factorial(3): factorial(3)=factorial(2)=factorial(1)=factorial(0)=1 我认为这种情况发生的原因是因为结果是在调用之后分配的,并且在我看来代码永远不会到达,因为流控制在分配结果之前暂停main.我认为这个函数只是运行n == 0的测试,直到返回1然后程序退出. 帮助我理解为什么我似乎无法将这个概念化. 解决方法
这是程序流程的概述.看起来可能有点令人困惑,但它可能会有所帮助.这里,不同的选项卡级别表示不同的堆栈,每一行是程序执行的命令.
factorial(3) | factorial(2) | | factorial(1) | | | factorial(0) | | | RETURNS 1 | | recurse = 1 | | result = 1 * 1 [since n=1] | | RETURNS 1 [returning result] | recurse = 1 [catching returned result of 1] | result = 2 * 1 [since n=2] | RETURNS 2 [returning result] recurse = 2 [catching returned result of 2] result = 3 * 2 [since n=2] RETURNS 6 [returning result] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |