python递归函数如何用于tri_recursion函数

时间:2018-09-30 14:05:30

标签: python recursion

我是python(编程)的新手,我发现the below recursive program很难遵循。在调试程序时,我发现它会经过递归,并且每次递归时k的值都会递减-1。 k在某一点为-1,编译器移至else部分并返回0。

最后k的值为1,这是怎么发生的?

def tri_recursion(k):
  if(k>0):
    result = k+tri_recursion(k-1)
    print(result)
  else:
    result = 0
  return result

print("\n\nRecursion Example Results")
tri_recursion(6)

输出:

递归示例结果
1
3
6
10
15
21

2 个答案:

答案 0 :(得分:1)

尝试用铅笔和纸描the功能。在这种情况下,该函数的打印语句可能会产生误导。

考虑程序的这一部分,

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

注意事项

  1. 在运行该程序时。k从不等于-1,实际上是不可能的。
  2. 以“编译器在程序中移动”的方式来考虑控制流是一种误导。编译器在执行期间不执行任何操作(JIT是另一回事)。最好从过程语言的控制流/执行顺序,函数式编程的等式和逻辑编程的关系方面进行思考。

答案 1 :(得分:0)

如果您调试这样的代码

def tri_recursion(k):
    if(k > 0):
        print('\t'*k,'start loop k',k)
        holder = tri_recursion(k - 1)
        result = k + holder
        print('\t'*k,'i am k(', k,')+previous result(', holder,')=',result)
    else:
        result = 0
        print('i reached when k =', k)
    print('\t'*k,'end loop', k)
    return result

print("\n\nRecursion Example Results")
tri_recursion(6)

您将看到类似的输出

Recursion Example Results
                         start loop k 6
                     start loop k 5
                 start loop k 4
             start loop k 3
         start loop k 2
     start loop k 1
i reached when k = 0
 end loop 0
     i am k( 1 )+previous result( 0 )= 1
     end loop 1
         i am k( 2 )+previous result( 1 )= 3
         end loop 2
             i am k( 3 )+previous result( 3 )= 6
             end loop 3
                 i am k( 4 )+previous result( 6 )= 10
                 end loop 4
                     i am k( 5 )+previous result( 10 )= 15
                     end loop 5
                         i am k( 6 )+previous result( 15 )= 21
                         end loop 6
21