簡體   English   中英

斐波那契數列中的重復與遞歸

[英]Repetition in Fibonacci series with recursion

我正在嘗試編寫一種使用遞歸打印前n數字fibonacci那契數列的方法。 我不想編寫該方法,然后在打印出第一個n fibonacci數列的方法之后創建一個單獨的循環。 我嘗試使用tryfinally塊,因為我知道finally語句將始終被執行。 fibonacci那契系列 output 工作正常,但不斷重復。 是否可以停止重復?

def fibonacci(n):
    if n <= 1:
        return n
    try:
        fib = fibonacci(n-1) + fibonacci(n-2)
        return fib
    finally:
        print("F{} = {}".format(n, fib))
    
fibonacci(6)

output

F2 = 1
F3 = 2
F2 = 1
F4 = 3
F2 = 1
F3 = 2
F5 = 5
F2 = 1
F3 = 2
F2 = 1
F4 = 3
F6 = 8

對您的代碼進行相當小的更改將避免不必要的遞歸,然后只打印(我希望)您想要的內容。

def fibonacci(n):
    if n <= 0:
        return 1, 1
    try:
        nxt, fib = fibonacci(n-1)
        return nxt+fib, nxt
    finally:
        print("F{} = {}".format(n, fib))
    
fibonacci(6)

Output:

F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8

這是可能的,但您需要有一個非本地值來記住是否已經打印了一個數字。 一種簡單的方法是使用閉包和本地定義的 function:

def fibonacci(n):
    done = -1
    def fibo(n):
        nonlocal done
        if n <= 1:
            fib = n
        else:
            fib = fibo(n-1) + fibo(n-2)
        if n > done:
            print("F{} = {}".format(n, fib))
            done = n
        return fib
    fibo(n)

您現在可以執行以下操作:

>>> fibonacci(6)
F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8

您可以使用如下默認參數:

def fibonacci(n, a=1, b=1):
    if n==0:
        return;
    else:
        print(a)
        fibonaci(n-1, b, a+b)

fibonacci(10)

Output:
1
1
2
3
5
8
13
21
34
55

您可以使您的 function 成為生成器並在打印語句中使用解包(如果需要,使用新的行分隔符):

def fibo(n,a=0,b=1):
    yield a
    if n>1:
        yield from fibo(n-1,b,a+b)

print(*fibo(10),sep="\n")

0
1
1
2
3
5
8
13
21
34

您還可以在 function 中使用 print function ,但現在函數應該如何操作:

def fibo(n,a=0,b=1):
    print(a)
    if n>1:fibo(n-1,b,a+b)

fibo(10)

順便說一句,斐波那契數列的現代版本從零開始

暫無
暫無

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

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