简体   繁体   English

python2.7中递归函数的执行顺序

[英]the executed order of recursion function in python2.7

def fac(n):
    if n==1 or n==2  or n==3:
        print "i am calling fac(",n,")"
        return  n
    else:
        print "i am calling fac(",n,")"
        x=fac(n-1)+fac(n-2)+fac(n-3)
        return  x  

The output of fac(6) is : fac(6)的输出是:

fac(6)
i am calling fac( 6 )
i am calling fac( 5 )
i am calling fac( 4 )
i am calling fac( 3 )
i am calling fac( 2 )
i am calling fac( 1 )
i am calling fac( 3 )
i am calling fac( 2 )
i am calling fac( 4 )
i am calling fac( 3 )
i am calling fac( 2 )
i am calling fac( 1 )
i am calling fac( 3 )
20

What is the rule for python2.7 to execute the recursion function? python2.7执行递归函数的规则是什么?
The result confused me,it can not be analysed from the calculation tree. 结果使我感到困惑,无法从计算树中进行分析。 Why the result is not other forms? 为什么结果不是其他形式?

What is the rule for python to deal with recursion calculation? python处理递归计算的规则是什么?

Python runs each call in the order it encounters the instruction to call it. Python按照遇到调用指令的顺序运行每个调用。 So, starting at the top of fac with n=6 , it will get to this line: 因此,从n=6fac顶部开始,它将到达以下行:

x=fac(n-1)+fac(n-2)+fac(n-3)

The first thing it will do is to calculate n-1=5 , and run fac(5) - which starts again at the top of the function. 要做的第一件事是计算n-1=5 ,然后运行fac(5) -它再次从函数顶部开始。 It will reach the same place and call fac(4) , which will call fac(3) - which just returns 3. Only now will it calculate n-2=2 and run fac(2) , and then fac(1) and do the addition. 它将到达相同的位置并调用fac(4) ,它将调用fac(3) -仅返回3。仅现在,它将计算n-2=2并运行fac(2) ,然后运行fac(1)和做加法。 Now fac(4) has finished, we're back in fac(5) and we keep going from fac(n-2) . 现在fac(4)已经完成,我们回到了fac(5) ,我们继续从fac(n-2)

If you modify your function to keep track of how deeply recursed you are, you can print the calls as a tree structure so you can see what's going on more easily: 如果您修改函数以跟踪递归的深度,则可以将调用打印为树状结构,以便更轻松地了解发生了什么:

def fac(n, level=0):
    print '{}fac({})'.format(level*'\t', n)

    if n==1 or n==2  or n==3:
        return n
    else:
        x = fac(n-1, level+1) + fac(n-2, level+1) + fac(n-3, level+1)
    return x

gives: 给出:

fac(6)
   fac(5)
      fac(4)
          fac(3)
          fac(2)
          fac(1)
      fac(3)
      fac(2)
   fac(4)
      fac(3)
      fac(2)
      fac(1)
   fac(3)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM