[英]Repetition in Fibonacci series with recursion
我正在嘗試編寫一種使用遞歸打印前n
數字fibonacci
那契數列的方法。 我不想編寫該方法,然后在打印出第一個n
fibonacci
數列的方法之后創建一個單獨的循環。 我嘗試使用try
和finally
塊,因為我知道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.