我正在从书中学习python:“ThinkPython”。
在第56页(第6章。卓有成效的函数),有一个递归函数可以计算任何数字的阶乘。它确实有效,但我不明白为什么。这是代码:
def factorial(n):
if n == 0:
return 1
else:
recurse = factorial(n-1)
result = n * recurse
return result
让我说我尝试3,我想这应该发生:
因此它应该在n = 0
之前执行相同操作并返回1
(它永远不会到达最后一行)。
答案 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 = 1
,result = 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 = 5 * 4 * 3 * 2 * 1