为什么我的回避功能会起作用?语法混乱



我已经编写了两个递归函数,它们的工作原理几乎相同。我试图正确地进行递归,然后偶然发现了答案,但语法让我感到困惑:

def fac(N):
"""
Factorial of N.
"""
################# This makes no goddamn sense to me #################
if N == 1:
return N
####### because N == 1, yet 'return N' is the correct result ########
elif N == 0:
return 1
return N*fac(N-1)

如何使N==1为真作为退出条件,同时存储fac(N(的结果?函数prod()也是如此,它与sum()类似。

def prod(List):
"""
Product of all numbers in a list.
"""
if len(List) == 1:
return List[-1]
return List[-1]*prod(List[:-1])

我不知道最终结果是如何存储在List[-1]中的。python解释器是否以一种特殊的方式理解return arg*func(arg)

考虑计算fac(4):所需的循环

1: fac(4) -> 4 * fac(3)  # It then has to calculate fac(3)
2: fac(3) -> 3 * fac(2)  # It then has to calculate fac(2)
3: fac(2) -> 2 * fac(1)  # It then has to calculate fac(1)
4: fac(1) -> 1  # Finally we've returned a value - now back up through the loops
3: fac(2) -> 2 * fac(1) == 2 * 1 == 2
2: fac(3) -> 3 * fac(2) == 3 * 2 == 6
1: fac(4) -> 4 * fac(3) == 4 * 6 == 24

第二部分实际上是一样的——向下递归,直到得到一个值,然后一直插入到原始请求。

没有什么特别的,但在这种情况下,请使用print和explore。

def fac(N): 
""" Factorial of N. """  
if N == 1: 
return N
elif N == 0: 
return 1 
return N*fac(N-1)

让我们看看fac(3(是如何工作的

# fac(3)
# fac(3) => 3 * fac(3-1)
# fac(3) => 3 * fac(3-1) => 2 * fac(2-1)
# fac(3) => 3 * fac(3-1) => 2 * fac(2-1) => return 1
# fac(3) => 3 * fac(3-1)  <= 2 * 1
# fac(3) <=  3 * 2 * 1
# 6

最新更新