假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
经过观察
0阶 1种
1阶 1种
2阶 2种
3阶 3种
4阶 5种
这是一个典型的斐波那契数列
第一种方法:循环解决
/**
* @param {number} n
* @return {number}
*/
var climbStairs = function(n) {
let temp = [];
temp[0] = 1;
temp[1] = 1;
temp[2] = 2;
temp[3] = 3;
//temp[4] = 5;
//1111 112 121 211 22
if(n < 4){
return temp[n];
}else{
for(let i = 4; i <= n;i++){
temp[i] = temp[i - 1] + temp[i - 2];
}
return temp[n];
}
};
第二种方法-递归
/**
* @param {number} n
* @return {number}
*/
function test(n){
if(n == 0||n == 1)
return 1;
else
return test(n - 1) + test(n - 2)
}
var climbStairs = function(n) {
let temp = [];
temp[0] = 1;
temp[1] = 1;
temp[2] = 2;
temp[3] = 3;
//temp[4] = 5;
//1111 112 121 211 22
if(n < 4){
return temp[n];
}else{
// for(let i = 4; i <= n;i++){
// temp[i] = temp[i - 1] + temp[i - 2];
// }
// return temp[n];
return test(n);
}
};
递归的确可以用,但是耗时太长了,所以不如直接for循环
第三种方法-公式
/**
* @param {number} n
* @return {number}
*/
var climbStairs = function(n) {
let number5 = Math.sqrt(5);
let fibn = Math.pow((1 + number5) / 2, n + 1) - Math.pow((1 - number5) / 2, n + 1);
return fibn/number5;
};