台阶问题可以转换成数学问题,即是著名的斐波那契数列。
/**
* 我们把n级台阶时的跳法看成是n的函数, 记为f(n)
* 当 n = 1时有1种跳法, 一次跳一阶
* 当 n = 2时有2种跳法, 一次跳一阶, 一次跳二阶
* 当 n > 2时, 第一次跳的时候就有两种不同的选择
* 1): 第一次只跳1级, 此时跳法数目等于后面剩下的n-1级台阶的跳法数目, 即为f(n-1)
* 2): 第一次跳2级, 此时跳法数目等于后面剩下的n-2级台:阶的跳法数目, 即为f(n-2)
* 因此n级台阶时的不同跳法的总数f(n) = f(n-1) + f(n-2)
* 因此可以将跳台阶问题转化成数学问题, 也即斐波那契数列
*/
/**
* 使用递归方式实现斐波那契数列
* 此方法弊端: 时间复杂度 2^n - 1
*/
function fibonacci_1(n) {
if (n === 1 || n === 2) {
return 1
} else {
return fibonacci_1(n - 1) + fibonacci_1(n - 2)
}
}
/**
* 使用普通方式实现
* 初始构造3个数, pre, next 以及 sum
* sum = pre + next
* pre = next
* next = sum
*/
function fibonacci_2(n) {
if (n === 1 || n === 2) {
return 1
} else {
let pre = 1
let next = 1
let sum = b
for (let i = 2; i < n; i++) {
sum = pre + next
pre = next
next = sum
}
return sum
}
}
console.log('fibonacci_1', fibonacci_1(10)) // 55
console.log('fibonacci_2', fibonacci_2(10)) // 55