avatar

目录
JavaScript之斐波那契序列

问题:

N级台阶(比如100级),每次可走1步或者2步,求总共有多少种走法?

解法:

问题本质上是斐波那契数列,假设只有一个台阶,那么只有一种跳法,那就是一次跳一级,f(1)=1;如果有两个台阶,那么有两种跳法,第一种跳法是一次跳一级,第二种跳法是一次跳两级,f(2)=2。如果有大于2级的n级台阶,那么假如第一次跳一级台阶,剩下还有n-1级台阶,有f(n-1)种跳法,假如第一次条2级台阶,剩下n-2级台阶,有f(n-2)种跳法。这就表示f(n)=f(n-1)+f(n-2)。

实现:

javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 1. 递归(普通版)
function Fibonacci1(n) {
if (n <= 2) return 1;
return Fibonacci1(n - 1) + Fibonacci1(n - 2);
}

// 2. 递归(尾调用优化)
function Fibonacci2(n, ac1 = 1, ac2 = 1) {
if (n <= 2) { return ac2 };
return Fibonacci2(n - 1, ac2, ac1 + ac2);
}

// 3.循环版
function Fibonacci3(n){
if (n===1 || n===2) {
return 1;
}
let ac1 = 1, ac2 = 1;
for (let i = 2; i < n; i++){
[ac1, ac2] = [ac2, ac1 + ac2];
}
return ac2;
}

// 4. 生成器版
function Fibonacci4(n) {
function* fibonacci() {
let [prev, curr] = [1, 1];
while (true) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}

if (n === 1 || n === 2) return 1;
let ac = 0;
const fibo = fibonacci();
for (let i = 2; i < n; i++) {
ac = fibo.next().value;
}
return ac;
}
文章作者: 盛顺炎
文章链接: https://www.shengshunyan.xyz/2018/10/14/JavaScript%E4%B9%8B%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E5%BA%8F%E5%88%97/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 果实的技术分享
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论