爬台阶
- 假如你在爬台阶,需要n阶才能到达楼顶,每次可以爬1或2个台阶,有多少种不同的方式爬到楼顶;
- n一定为正整数;
- 可以把总台阶分为两部分,即将要爬的一步,和这一步爬完之后剩余的台阶;每次可以选择爬1或2阶,知道剩余的台阶数为0,终止;
function climb(n) {
if(n === 0) return 1
climb(n - 1)
if(n -2 >=0){
climb(n -2)
}
}
function climb(n) {
if(n <= 0) return 0
if(n <=2) return n
return climb(n-1) + climb(n-2)
}
let cache = {}
function clinmb(n) {
if (n <= 0) return 0
if (n <= 2) return n
if (cache[n]) return cache[n]
return cache[n] = climb(n - 1) + climb(n - 2)
}
斐波那契数列
- 首项为0, 第二项为1,... 第n项为n-1和第n-2项之和
function fibonacci(n) {
if(n <= 2) return n-1
let n1 = 0, n2 = 1
for(let i = 2; i < n; i++) {
[n1, n2] = [n2, n1 + n2]
}
return n2
}
function fibonacci(n) {
return n <= 2 ? n-1 : fibonacci(n-1) + fibonacci(n-2)
}
let cache = {}
function fibonacci(n) {
if(n<0) throw new Error("输入数字不能小于0")
if(n <= 2) return n-1
if(cache[n]) return cache[n]
return cache[n] = fibonacci(n -1) + fibonacci(n -2)
}
汉诺塔问题
- 汉诺塔问题指的是:将一个柱子中的所有圆盘移动到另一个柱子,移动过程需遵守以下规则:每次只能移动一个圆盘,而且只能移动某个柱子上最顶部的圆盘;移动过程中,必须保证每个柱子上的大圆盘都位于小圆盘的下面;
- 加入有三个桩A,B,C,初始盘子在A桩上,移动完成后盘子在C桩上;
- 当n == 1时,直接将盘子从A 移动到C;
- 当n > 1时,可以拆分成三个步骤
- 1,将n-1个盘子从A移动到B;
- 2,将编号为n的盘子从A移动到C;
- 3,将n-1个盘子从B移动到C;
- 在此过程中1,3显然是递归调用
function hanoi(n, current = 'A', temp = 'B', target = 'C') {
if(n<=0) return 0
let sum = 1
sum += hanoi(n-1,current, target, temp)
console.log(current + ' ---> ' + target)
sum += hanoi(n - 1, temp, target, current)
return sum
}