簡體   English   中英

在Python中遞歸生成n階乘列表

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

您的代碼中缺少的關鍵事項是:

  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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM