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
}