在Python中递归生成n阶乘列表

2024-09-30 06:20:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中实现这个有困难。我想写一个输入n为(唯一)的函数,它递归地生成一个阶乘值列表1。。。n!在

到目前为止,我已经考虑过将n阶乘的递归派生值存储在一个变量中,然后添加(push?)把它们列在一个列表中。我的问题是如何“保存”列表?我不知道如何检查一个列表是否存在,以及。。。在

def recFactorial(n):
    if n == 1:
        return 1
        print(l)
    else:
        l = []
        f = n * recFactorial(n-1)
        if l:
            l = l.push(f)
        else:
            l = []

Tags: 函数列表returnifdefpushelseprint
3条回答

代码中缺少的关键内容是:

  1. 因为您希望函数返回一个列表,所以基本情况(n==1)需要返回一个列表,正如Blckknght在他的答案中解释的那样。
  2. 非基本情况(n>;1)也需要返回某些内容!在编写递归代码时,忽略了从每个执行路径返回的内容,这是一个非常常见的错误。

这个版本是一个递归生成器。它不返回一个列表,它是一个iterable,一次只生成一个阶乘值,但是如果需要,可以很容易地在列表中捕获这些值。在

def gen_factorial(n):
    if n == 1:
        yield 1
    else:
        for u in gen_factorial(n - 1):
            yield u
        yield u * n

for u in gen_factorial(5):
    print(u)

print(list(gen_factorial(8)))

输出

^{pr2}$

递归函数调用看不到对同一函数的其他调用的局部变量。如果您希望多个调用能够使用同一个列表,那么列表必须是函数的参数或返回值(或者我假设是一个全局变量,但这将是一个非常糟糕的设计)。在

在这种情况下,我认为将list作为函数的返回值传递是最简单的。它将在基本情况下创建,其中您将返回普通列表[1]。每个外部调用都会向列表追加一个值(并使用之前在列表上的最后一个值进行计算)。在

def recFactorialList(n):
    if n == 1:
        return [1]   # base case, still returns a list

    lst = recFactorialList(n-1)
    n_fac = lst[-1] * n   # use the last value to calculate a new value
    lst.append(n_fac)   # add n factorial to the end of the list
    return lst   # return the updated list

当您在递归中遇到局部变量的问题时,我建议您添加一个包装器函数。下面这个呢?在

def fact_wrapper(n):
    lst = [1]
    def fact(n):
        if n == 0 or n==1:
            return 1
        else:
            a = n * fact(n-1)
            lst.append(a)
            return a

    fact(n)
    return lst


print(fact_wrapper(5)) 

输出:

^{pr2}$

如果递归不是那么重要,您可以编写一个简单的生成器:

def factorial(n):
    result = 1
    for i in range(1,n+1):
       result *= i
       yield result

然后

print list(factorial(5))

输出:

^{pr2}$

或者,也可以使用next()来延迟计算值。如果您不熟悉python生成器,您可能会看到this。在

相关问题 更多 >

    热门问题