斐波那契数列的经典算法题

239 阅读1分钟

1.有一段楼梯有n级台阶,规定每一步只能跨一级或两级,要登上第 n 级台阶有几种不同的走法?

a.正常算法

前置知识:

①:排列组合公式

排列数:从n个中取m个排一下,有n(n-1)(n-2)...(n-m+1)种,即n!/(n-m)!

组合数:从n个中取m个,相当于不排,就是n!/[(n-m)!m!]

实际求解:

第几次迈出第二步是有区别的,因此这是一个排列数:

function calcNum(n) {
       let total = 0
       for (let i = 0; i * 2 <= n; i++) {
         const j = n - i * 2
         total += calcC(i + j, j)
       }
//这里先计算跨两阶楼梯的所有情况   
       return total
//再计算出每种情况的排列组合次数,最后求和        
       function calcC(n, m) {      
         let nT = 1
         let mT = 1
         for (let i = n; i > m; i--) {
           nT *= i
         }
         for (let i = n - m; i > 0; i--) {
           mT *= i
         }
         return nT / mT
       }
     }

b.利用斐波那契数列求解

楼梯走法次数分别是 1,1,2,3,5,8,13,21,34…很明显这是一个斐波那契数列

斐波那契数列求解:

function def(n){
          if(n===1) return 1
          if(n===2) return 2
          return def(n-1)+def(n-2)
          }

求解优化:

function def(n){
         if(n===1) return 1
         if(n===2) return 2
         let sum = 0 
         let one = 1
         let two = 2
         for(let i =3 ; i<n;i++){
          sum = one + two
          one = two
          two = sum
         }
         return sum
     }