[英]Recursively Generating a List of n choose k combinations in Python - BUT return a list
[英]Recursively generating a list of n factorial in Python
我在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 = []
由於你在遞歸中遇到麻煩的局部變量,我建議你添加一個包裝函數。 下面怎么樣?
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生成器,你可能會看到這個 。
遞歸函數調用無法看到其他調用同一函數的局部變量。 如果你想要幾個調用能夠使用相同的列表,列表需要是函數的參數或返回值(或者我想一個全局變量,但這將是非常糟糕的設計)。
在這種情況下,我認為將列表作為函數的返回值傳遞是最容易的。 它將在基本情況下創建,您將返回普通列表[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 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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.