簡體   English   中英

使用For循環的斐波那契數列——不懂循環

[英]Fibonacci Sequence using For Loop - Don't understand the loop

python 的新手,我想了解我是如何得到正確答案的

編寫代碼:

  1. 計算並打印斐波那契數列的前 50 項。
  2. 打印每個術語和數字如下:
term: 0 / number: 0
term: 1 / number: 1
term: 2 / number: 1
term: 3 / number: 2
term: 4 / number: 3
term: 5 / number: 5

我得到了正確的答案,但“其他”部分是如何工作的?

c = a + b
print(f'term: {term} / number: {c}')
a = b
b = c

有人可以准確地向我解釋上面的變量每次循環時是如何變化的嗎? 我不明白 c = 1 + 1 是如何打印 c = 2 但它是如何打印 c = 3 之后的?

a = 1
b = 1
for term in range (50):
    if term <= 1:
        print(f'term: {term} / number: {term}')
    elif term == 2:
        print(f'term: {term} / number: 1')
    else:
        c = a + b
        print(f'term: {term} / number: {c}')
        a = b
        b = c

正如您所指出的,我們第一次進行 else 部分時,我們有以下分配,我們應用以下分配:

c = a + b # <-- (1) + (1) = 2
a = b     # <-- (1)
b = c     # <-- (2)

因此,在第一次遍歷 else 部分之后,b 是最近的斐波那契數(在本例中為 2),a 是之前的那個。 下一次,我們執行以下操作。

c = a + b # <-- (1) + (2) = 3
a = b     # <-- (2)
b = c     # <-- (3)

這樣,b 已更新為下一個 Fibonacci 數,a 更新為 2,這最近的 Fibonacci 數,但現在是之前的那個。

在這種方式下,c 始終是最新的斐波那契數,這個值被分配給 b 以供下一個循環使用,b 的那個值最終被分配給 a。


順便說一句,如果將代碼重構為以下任何一種,則可以避免 if/elif/else 塊的邏輯:

a = 1
b = 1
print('term 0 / number: 0')
print('term 1 / number: 1')
print('term 2 / number: 1')

for term in range (3,50):
    c = a + b
    print(f'term: {term} / number: {c}')
    a = b
    b = c

或者,

a = 0
b = 1
for term in range (50):
    print(f'term: {term} / number: {a}')
    c = a + b
    a = b
    b = c

以下也適用並刪除變量 c:

a = 0
b = 1
for term in range (50):
    print(f'term: {term} / number: {a}')
    (a, b) = (b, a+b)

斐波那契數列

在數學中,斐波那契數列(通常表示為 Fn)構成一個數列,即斐波那契數列,其中每個數都是前兩個數的和。 該序列通常從 0 和 1 開始,盡管有些作者從 1 和 1 或有時(如斐波那契)從 1 和 2 開始序列。從 0 和 1 開始,序列中的前幾個值是:[1]

0、1、1、2、3、5、8、13、21、34、55、89、144。

因此我們可以看到,為了獲得下一個數字,我們將前兩個數字相加。

現在讓我們試運行您的代碼

a = 1
b = 1
for term in range (50):
    if term <= 1:
        print(f'term: {term} / number: {term}')
    elif term == 2:
        print(f'term: {term} / number: 1')
    else:
        c = a + b
        print(f'term: {term} / number: {c}')
        a = b
        b = c

前兩行:-

a = 1
b = 1

正在指定系列中的第二個和第三個兩個值。這樣我們就可以使用它們來獲得下一項。

然后在第三行:-

for term in range (50):

我們正在啟動一個 for 循環,它將 go 執行 50 次,因為它在range(50):注意:- 這控制了連續打印的術語數。 將范圍內的數字更改為要打印的術語數。


下一個if語句:-

if term <= 1: print(f'term: {term} / number: {term}') 此 if 語句處理前兩項的條件。 其中term的值為0和1。我們在print語句中使用了for循環中的變量term來打印term及其值。


elif聲明:-

elif term == 2: print(f'term: {term} / number: 1')

我們正在使用這個 elif 語句來打印第三項。 因為我們需要第三項為 1 (0 + 1),所以我們使用 elif 語句將其硬輸入到 print 語句中。


現在您要求的 else 語句:

 else:
    c = a + b
    print(f'term: {term} / number: {c}')
    a = b
    b = c

此 else 語句處理4th term及其后的項。

c=a+b

將根據斐波那契數列的要求添加前兩項

print(f'term: {term} / number: {c}')

這將打印術語和值。

然后,

a = b
b = c

值更新下一個術語 並且循環以新值重新啟動。

暫無
暫無

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

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