尝试使用铅笔和纸张跟踪功能.在这种情况下,print语句insde该函数可能有点误导.
考虑这部分程序,
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
注意事项
>在运行这个program.k永远不会等于-1,事实上它是不可能的.
>根据“编译器在程序中移动”来考虑控制流是错误的.编译器在执行期间不执行任何操作(JIT是另一回事).最好从程序语言中的控制流程/执行顺序进行思考,在函数式编程和逻辑编程中的关系中进行等级考虑.