题目描述

  1. 共有n个台阶,每次只能上1个台阶或者2个台阶,共有多少种方法爬完台阶?
  2. 共有n页书,每次只能翻1页或者2页书,有多少种方法翻完全书?
  3. 形如1,1, 2, 3, 5, 8, 13, 21, 34, 55的数列,后一位是前面两位相加(斐波那契数列),写出函数要求找到第N位是多少,如:fib(3) => 3,fib(5) => 8,要求时间复杂度为O(n)。[更改前两位就可以]

题目难度:⭐

  • 100个台阶 需要f(100) = f(99)+f(98)
  • 典型的f(n)=f(n-1)+f(n-2)问题
// 方法一:递归
// 时间复杂度F(n) = F(n-1) + F(n-2) =>O(2^n)
function f1(n){
    if(!typeof n ==="number"){
        throw "n is not a number!";
    }
    if ( n===0 || n===1 ){  
        return 1  
    }  else {
        return f(n-1) + f(n-2)  
    }
}
/*------------------------------------------------*/
// 方法二 用一个数组把计算过的结果存一遍
// 线性时间复杂度 O(n) 
function f2(n){
    let ary = new Array(n)
    ary[0] = 1; 
    ary[1] = 1; 
    for (let i=2;i<n+1;i++){  //注意这里一定不是长度 
        ary[i]=ary[i-1]+ary[i-2] 
    }  
    return ary[n];
}

// 方法2.1 结合ES6的数组解构
function Fib(n) {
    let a =1 ,b =1;
    let arr = [a,b]
    while (arr.length < n+1) {
        [a,b] = [b,a+b]; //es6的解构
        arr.push(b);
    }
    return arr[n];
}

/*------------------------------------------------*/
// 方法三 递归 用对象保存结果
// 两个函数
// 线性时间复杂度 O(n) 
var cache = {};
function f3(n){
    if(!(n in cache)){
        cache[n] = _fib(n)
    }   
    return cache[n]
}
    
function _fib(n){
    if(n===0||n===1){
        return 1
    } else {
        return f3(n-1)+f3(n-2)
    }
}

鹿角包
175 声望8 粉丝

不苦程序媛