一个人爬一个n级楼梯,他可以一次迈1步,也可以1次迈两步,也可以一次迈三步,……也可以一次迈n步。 写一个函数steps(n),求这个人一共有多少种走法?

    答案:

    题目选自《剑指Offer》

    利用递归关系

    1. function steps(n) {
    2. if(n === 0) return 1
    3. let sum = 0
    4. for(let i = 0; i < n; i++){
    5. sum += steps(i)
    6. }
    7. return sum
    8. }
    1. function steps(n){
    2. if(n === 0) {return 1}
    3. return [...Array(n)].map((_, i) => i).reduce( (s, i) => {
    4. return steps(i) + s
    5. }, 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)
    }