- 原文地址:Even Fibonacci numbers (Python vs. JavaScript)
- 原文作者:Ethan Jarrell
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:zephyrJS
- 校對者:hexianga, Starriers
斐波那契數列中的偶數 (Python vs. JavaScript)
對於僱主來說,用某種方式來生成斐波那契數列是一道熱門的面試題。而求斐波那契數列中的所有偶數便是其熱門的變體之一。這裡,我將用 Python 和 JavaScript 兩種方式來實現。為了讓事情變得更加簡單,我們將只生成 4,000,000 以下的序列中的偶數,並且對他們進行求和。
什麼是斐波那契數列?
在斐波那契數列中每一個新項都等於前兩項之和。所以,我們就能看到這樣一個例子,從 1 和 2 開始,序列中的前 10 個數字便是:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89
我們將如何生成序列中的所有數字呢?
首先,我們可以通過類似下面這種方式來思考如何生成數列:
這裡的問題是我們沒辦法為每個數字都建立一個變數,所以更好的解決方案是,每當我們呼叫完 a + b = c 之後,我們將對這三個變數重新賦值。所以現在我們將上一個 b 的值賦給 a,將上一個 c 的值賦給 b,以此類推。它看起來會像是這樣:
所以初步的想法是,在某個迴圈裡,我們要檢查並確保不要觸發 4,000,000 這個臨界點,然後我們重置 a、b 和 c 的值,緊接著將 c 存入到陣列或列表中。最後我們將對這個陣列或列表進行求和。
虛擬碼的討論到此為止,接下來我們將展示一些例項程式碼,讓我們看看將會是什麼樣子:
Python:
讓我們像虛擬碼那樣開始。我將空陣列賦值給變數 'x'。
x = []
a = 1
b = 2
c = a + b
複製程式碼
接下來,我將使用 Python 的 while 迴圈來檢查並確保 c
的值小於 4000000
。
while c < 4000000:
a = b
b = c
c = a + b
if c % 2 == 0:
x.insert(0, c)
複製程式碼
因為我們只需要偶數,所以在 while 迴圈內部,我們將檢查並確保它是一個偶數,才會執行插入到 x.
的操作。接下來,我們會在 Python 中對這個列表裡的數字進行求和並列印這個值。
numSum = (sum(x))
print numSum
複製程式碼
JavaScript:
我想用 JavaScript 的方式去解決,但它跟 Python 相比會有些許差異。首先我將建立一個空陣列,然後對陣列的前兩個索引賦值:
var fib = [];
fib[0] = 1;
fib[1] = 2;
複製程式碼
接著,我將迴圈陣列。選擇我需要的索引來生成斐波那契數列。在上一個例子裡,每一次迴圈我們都會重置 a、b 和 c 的值。但在這個版本里,我們將不會重置任何一個值,取而代之的是,我會把 f[i-2] + f[i-1] 的值賦值給 f[i],然後把 f[i] 的值存入到陣列中。
for(i=2; i<=50; i++) {
fib[i] = fib[i-2] + fib[i-1];
fib.push(fib[i]);
}
複製程式碼
至此,我擁有一個完整的斐波那契數列,卻不是僅有偶數的序列,所以我將用第二個迴圈來獲取少於 4,000,000 並且裡面都是偶數的陣列。
arrUnder4mil = [];
for (var i = 0; i < fib.length; i++) {
if (fib[i] <= 4000000 && fib[i] %2 == 0) {
arrUnder4mil.push(fib[i]);
}
}
複製程式碼
最後,我將對陣列裡面數字進行求和,並列印這個結果。
let fibSum = arrUnder4mil.reduce((a, b) => a + b, 0);
console.log(fibSum);
複製程式碼
總結:
儘管我們的 JavaScript 程式碼有點多,但這兩種方法都能在幾毫秒內解決這個問題。我認為,對於這些技術面試,通過兩種不同的方式或語言能過幫助僱主發現你的全面性和創造性。但最重要的是,它展示了你的邏輯思維能力。如果有任何反饋,請聯絡我。謝謝!
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。