关于追踪这个计划

时间:2011-12-10 23:53:48

标签: python tracing

我有以下代码输出6,720。然而,在查看代码后,我不知道720是如何得到的。

def f(n):
    if (n==0):
        return 1
    else:
        v = f(n-1)
        r = n * v
        return r

n = 6
print(n, f(n))

4 个答案:

答案 0 :(得分:3)

您的函数使用名为recursion的技术。

  • f(6)是6 * f(5)。由于f(5)是120(下面的证据),这给出了720。
  • f(5)是5 * f(4)。由于f(4)是24(下面证明),这给出了120。
  • 等...
  • f(0)为1。

答案 1 :(得分:1)

您的f函数正在计算其参数的factorial。它通常用感叹号表示。

简单地说就是:

6! = 6 * 5 * 4 * 3 * 2 * 1

你的循环以递归方式调用自身,以便计算5,4,3,2,1的值,然后当它达到0时它会停止递归。然后f开始返回。这就是你的720值的来源。

答案 2 :(得分:1)

f(6) = 6  *  f(5)                                    = 720
              |------------------------------------
              5  *  f(4)                             = 120
                     |-----------------------------
                     4  *  f(3)                      =  24
                            |----------------------
                            3  * f(2)                =   6
                                  |----------------
                                  2  *  f(1)         =   2
                                         |---------
                                         1  *  f(0)  =   1
                                                |
                                                1    =   1  (base case)

答案 3 :(得分:1)

Python包含一个trace module,可以准确显示正在发生的事情。

以下是您脚本的输出:

~/tmp $ python3.2 -m trace --trace fact.py
 --- modulename: fact, funcname: <module>
fact.py(1): def f(n):
fact.py(9): n = 6
fact.py(10): print(n, f(n))
 --- modulename: fact, funcname: f
fact.py(2):     if (n==0):
fact.py(5):         v = f(n-1)
 --- modulename: fact, funcname: f
fact.py(2):     if (n==0):
fact.py(5):         v = f(n-1)
 --- modulename: fact, funcname: f
fact.py(2):     if (n==0):
fact.py(5):         v = f(n-1)
 --- modulename: fact, funcname: f
fact.py(2):     if (n==0):
fact.py(5):         v = f(n-1)
 --- modulename: fact, funcname: f
fact.py(2):     if (n==0):
fact.py(5):         v = f(n-1)
 --- modulename: fact, funcname: f
fact.py(2):     if (n==0):
fact.py(5):         v = f(n-1)
 --- modulename: fact, funcname: f
fact.py(2):     if (n==0):
fact.py(3):         return 1
fact.py(6):         r = n * v
fact.py(7):         return r
fact.py(6):         r = n * v
fact.py(7):         return r
fact.py(6):         r = n * v
fact.py(7):         return r
fact.py(6):         r = n * v
fact.py(7):         return r
fact.py(6):         r = n * v
fact.py(7):         return r
fact.py(6):         r = n * v
fact.py(7):         return r
6 720