2016-11-12 50 views
2

我在Python中实现这个时遇到了问题。我想用(唯一)输入n来编写一个函数,递归地生成阶乘值1的列表! ... n!在Python中递归生成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 = [] 
+0

你为什么想用递归来做到这一点?这是一项任务吗? –

+0

这不是一项任务,它是(未评级)研讨会的一部分。我理解递归,但我不知道如何实现递归列表。 – theGreatWhatever

回答

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 
+0

难题。谢谢! – theGreatWhatever

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

这个人似乎并不熟悉发电机。你可以向他展示一个如何使用它的例子。 –

+1

@StamKaly,你可能会喜欢更新的答案;) –

3

关键的东西从你的代码所缺少的:

  1. 既然你希望函数返回一个列表的基本情况(N == 1)需要返回一个列表,如Blckknght在解释他的回答。
  2. 非基本情况下(n> 1)也需要返回一些东西!编写递归代码忽略从每个执行路径返回某些内容时,这是一个非常常见的错误。

这个版本是一个递归发电机。它不会返回一个列表,它是一个可以一次生成一个阶乘值的迭代器,但如果需要,可以很容易地将它们捕获到列表中。

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]