题目描述:
- 共有n个台阶,每次只能上1个台阶或者2个台阶,共有多少种方法爬完台阶?
- 共有n页书,每次只能翻1页或者2页书,有多少种方法翻完全书?
- 形如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)
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。