2016-11-12 92 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]