Python中的这个递归函数如何工作?

时间:2015-10-13 13:57:49

标签: python python-2.7 recursion recursive-datastructures

我正在从书中学习python:“ThinkPython”。

在第56页(第6章。卓有成效的函数),有一个递归函数可以计算任何数字的阶乘。它确实有效,但我不明白为什么。这是代码:

def factorial(n):
    if n == 0:
        return 1
    else:
        recurse = factorial(n-1)
        result = n * recurse
        return result

让我说我尝试3,我想这应该发生:

  1. 输入阶乘函数,n = 3
  2. 输入else语句,因为n不是0
  3. 这里以n = 2
  4. 回到第1步的开头

    因此它应该在n = 0之前执行相同操作并返回1(它永远不会到达最后一行)。

3 个答案:

答案 0 :(得分:4)

您的职能是:

def factorial(n):
 if n == 0:
  return 1
 else:
  recurse = factorial(n-1)
  result = n * recurse
  return result

让我们一步一步地执行这个功能,从n = 3开始。

Entering 
STATE 1 
n = 3 
recurse = factorial(3-1)

STATE 2
n = 2
recurse = factorial(2-1)

STATE 3
n = 1
recurse = factorial(1-1)

STATE 4
You now have an n = 0, so you return 1 to STATE 3.

STATE 3
n = 1
recurse = 1
result = 1
return result to STATE 2

STATE 2
n = 2
recurse = 1
result = 2 * 1 = 2
return result to STATE 1

STATE 1
n = 3
recurse = 2
result = 3 * 2 = 6

然后6,阶乘3,返回到调用函数:D

递归确实是一个棘手的问题,它需要时间来适应它以及它可以使用的不同方式。

答案 1 :(得分:1)

就你而言,你是对的。但是,你没有继续下去。当factorial(0)调用返回时,它返回到哪里?它返回

recurse = factorial (n - 1)

n = 1处行,然后从那里继续。 所以,recurse = 1result = 1* 1 = 1并返回1.再次,这将转到n = 2 case.so,result = 2*1 = 2中的recurse =行,并将其返回到recurse = n = 3的行,所以result = 2 * 3 = 6,这是返回的。

答案 2 :(得分:1)

n的阶乘被定义为n * (n-1) * (n-2)等,直到1

所以n = 5 -> 5*4*3*2*1

在代码中,factorial被定义为n * whatever the factorial of n-1 is

Python会通过问自己找出最后一部分:n-1的阶乘是什么?好吧,(n-1) * whatever the factorial of (n-1)-1是。

你看到循环/递归吗?

因为对于n==0,factorial将返回1,所以python可以反复询问递归部分是什么,直到它自己询问what is the factorial of 0?。这部分在第一部分是硬编码的。

一旦进入最后一部分,它也知道其他答案! 对于n == 5

  • 阶乘是5 *(阶乘4)
    • 阶乘是4 *(阶乘3)
      • ...
        • 阶乘0为1。

因子5 = 5 * 4 * 3 * 2 * 1