我在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 = []
答案 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)
您的代码中缺少的重要事项是:
此版本是递归生成器。它不会返回一个列表,它是一个可迭代的,一次只能生成一个因子值,但如果需要,可以很容易地捕获列表中的那些。
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]