为什么我的回复功能正常工作?语法混乱

问题描述 投票:1回答:2

我已经编写了两个递归函数,它们的功能几乎相同。我试图使递归正确,然后我偶然发现了答案,但是语法使我感到困惑:

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)

python python-3.x recursion
2个回答
1
投票

考虑计算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

第二部分实际上是同一件事-递归向下直到获得一个值,然后将其一直插入到原始请求中。


1
投票

没什么特别的,但是在这种情况下,请使用打印并浏览。

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
© www.soinside.com 2019 - 2024. All rights reserved.