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

时间:2016-11-12 06:13:29

标签: python list recursion

我在Python中实现它时遇到了麻烦。我想用(唯一)输入n编写一个函数,递归生成一个因子值列表1! ...... n!

到目前为止,我已经考虑过将n-factorial的递归派生值存储在变量中,然后将它们添加(推送?)到列表中。我的问题是如何保存'列表?我不知道如何检查列表是否存在......

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 = []

3 个答案:

答案 0 :(得分:3)

当你在递归中遇到麻烦的局部变量时,我建议你添加一个包装函数。下面怎么样?

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)) 

输出:

[1, 2, 6, 24, 120]

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

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

然后,

print list(factorial(5))

输出:

[1, 2, 6, 24, 120]

或者,您也可以使用next()懒惰地评估值。如果您不熟悉python生成器,可能会看到this

答案 1 :(得分:3)

递归函数调用无法查看对同一函数的其他调用的局部变量。如果你想要几个调用能够使用相同的列表,那么列表需要是函数的参数或返回值(或者我想一个全局变量,但那将是非常糟糕的设计)。

在这种情况下,我认为将列表作为函数的返回值传递是最简单的。它将在基本情况下创建,您将返回简单列表[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

答案 2 :(得分:3)

您的代码中缺少的重要事项是:

  1. 由于你希望函数返回一个列表,所以基本情况(n == 1)需要返回一个列表,正如Blckknght在他的回答中所解释的那样。
  2. 非基本情况(n> 1)也需要返回一些东西!在编写递归代码时忽略从每个执行路径返回一些内容时,这是一个非常常见的错误。
  3. 此版本是递归生成器。它不会返回一个列表,它是一个可迭代的,一次只能生成一个因子值,但如果需要,可以很容易地捕获列表中的那些。

    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)))
    

    <强>输出

    1
    2
    6
    24
    120
    [1, 2, 6, 24, 120, 720, 5040, 40320]