我们知道,斐波那契数列最简单的实现方式就是递归来实现,但是,当n的数值大于150,或者200(,或者更多一丢丢的数组,好一点的电脑性能)以上的时候,就会变的很卡
// 递归实现:
function fibonacci(n){
if(n <= 0) return 0;
if(n == 1) return 1;
return fibonacci1(n-1) + fibonacci (n - 2)
}
下面,用迭代循环的方式实现
实现思路
- 用两个变量分别记录中间结果, n1记录n-1的结果, n2记录n-2的结果
- n1初始化为1, n2初始化为0, 循环的时候,将n1, n2整体向后移动
- 用res记录
// 0 1 1 2 3 5 8 13 21 ...
function fibonacci(n){
if(n <= 0) return 0;
if(n == 1) return 1;
let n1 = 1;
let n2 = 0;
let result = 0;
console.time('testFibonacci')
for(let i = 0; i<= n;i++){
result = n1 + n2;
// 记录中间值
n2 = n1;
n1 = result;
}
console.timeEnd('testFibonacci') // testForEach: 0.076ms
return result;
}
// 测试
console.log(fibonacci(9)) // 34
// console.log(fibonacci(500)) // 1.394232245616977e+104

循环写法-时间消耗:
扩展- 青蛙跳台阶问题
一只青蛙,一次可以跳1级,也可以跳2级 问:青蛙跳到n级台阶,总共有多少种方式?? 解题思路: 用动态规划分析问题
- 要跳到1级台阶,就有1种方式f(1)=1
- 要跳到2级台阶,就有1种方式f(2)=2
- 要跳到n级台阶,就有1种方式f(n)=f(n-1) + f(n-2)
动态规划解题思路:1. 把一个大问题,拆解为多个小问题,逐渐级向下拆解 2. 用递归的思路去分析问题,再改为循环来实现 算法的三大思维: 贪心, 二分,动态规划
那么到这里,青蛙跳台阶代码实现,就跟斐波那契数列完全一样了