尝试用铅笔和纸追踪该功能。在这种情况下,该函数的打印语句可能会引起误解。
考虑一下程序的这一部分,
if(k>0): result = k+tri_recursion(k-1)...
从这里,
tri_recursion(6) = 6 + tri_recursion(5)
因此,要得到结果,因为
tri_recursion(6)我们必须得到
tri_recursion(5)遵循以下逻辑的结果,问题可以简化为:
tri_recursion(6) = 6 + tri_recursion(5) = 6 + 5 + tri_recursion(4) = 6 + 5 + 4 + tri_recursion(3) = 6 + 5 + 4 + 3 + tri_recursion(2) = 6 + 5 + 4 + 3 + 2 + tri_recursion(1) = 6 + 5 + 4 + 3 + 2 + 1 + tri_recursion(0)
现在注意0不大于0,因此程序移至else子句的主体:
else: result = 0...
这意味着
tri_recursion(0) = 0。因此:
tri_recursion(6) = 6 + 5 + 4 + 3 + 2 + 1 + tri_recursion(0)= 6 + 5 + 4 + 3 + 2 + 1 + 0= 21
注意事项
- 在运行该程序。
k
永远不等于-1
,实际上这是不可能的。 - 以“编译器在程序中移动”的方式来考虑控制流是一种误导。编译器在执行期间不执行任何操作(JIT是另一回事)。最好从过程语言的控制流/执行顺序,函数式编程的等式和逻辑编程的关系方面考虑。



