一个人爬一个n级楼梯,他可以一次迈1步,也可以1次迈两步,也可以一次迈三步,……也可以一次迈n步。 写一个函数steps(n),求这个人一共有多少种走法?
答案:
题目选自《剑指Offer》
利用递归关系
function steps(n) {if(n === 0) return 1let sum = 0for(let i = 0; i < n; i++){sum += steps(i)}return sum}
function steps(n){if(n === 0) {return 1}return [...Array(n)].map((_, i) => i).reduce( (s, i) => {return steps(i) + s}, 0)
由递归关系(自上而下),找到递推关系(自下而上),避免重复计算(也就是动态规划)
function steps(n){
const s = [1, 1]
for(let i = 2; i <= n; i++){
s[i] = s.reduce((a, b) => a + b )
}
return s.pop()
}
发现数学关系,然后直接求解
function steps(n){
return 1 << (n-1)
}
