我理解递归的概念,我感到困惑的是流量控制.我看到过这种方式有两种,一种是我得到的,另一种是我没有的.例一:
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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。