- 原文地址:Even Fibonacci numbers (Python vs. JavaScript)
- 原文做者:Ethan Jarrell
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:zephyrJS
- 校对者:hexianga, Starriers
对于雇主来讲,用某种方式来生成斐波那契数列是一道热门的面试题。而求斐波那契数列中的全部偶数即是其热门的变体之一。这里,我将用 Python 和 JavaScript 两种方式来实现。为了让事情变得更加简单,咱们将只生成 4,000,000 如下的序列中的偶数,而且对他们进行求和。javascript
在斐波那契数列中每个新项都等于前两项之和。因此,咱们就能看到这样一个例子,从 1 和 2 开始,序列中的前 10 个数字即是:前端
1, 2, 3, 5, 8, 13, 21, 34, 55, 89java
首先,咱们能够经过相似下面这种方式来思考如何生成数列:python
这里的问题是咱们没办法为每一个数字都建立一个变量,因此更好的解决方案是,每当咱们调用完 a + b = c 以后,咱们将对这三个变量从新赋值。因此如今咱们将上一个 b 的值赋给 a,将上一个 c 的值赋给 b,以此类推。它看起来会像是这样:android
因此初步的想法是,在某个循环里,咱们要检查并确保不要触发 4,000,000 这个临界点,而后咱们重置 a、b 和 c 的值,紧接着将 c 存入到数组或列表中。最后咱们将对这个数组或列表进行求和。ios
伪代码的讨论到此为止,接下来咱们将展现一些实例代码,让咱们看看将会是什么样子:git
让咱们像伪代码那样开始。我将空数组赋值给变量 'x'。github
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 的方式去解决,但它跟 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、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。