简介
本文给出青蛙上台阶问题的终极解答,给出通用模板。
1. 题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?
// 注意n为自然数,即 0,1,2,...
const jump = n => {
if (n <= 2) {
return n
}
return jump(n - 1) + jump(n - 2)
}
// 非递归写法
const jump = n => {
if (n <= 2) {
return n
}
let [first, second] = [1, 2]
let count = 3
while (count++ <= n) {
;[first, second] = [second, first + second]
}
return second
}
// 输出前10个:
/*
1
2
3
5
8
13
21
34
55
*/
2. 题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,还可以跳上3级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?
const jump = n => {
if (n <= 2) {
return n
}
if (n === 3) {
return 4 // jump(1)+jump(2)+1
}
return jump(n - 1) + jump(n - 2) + jump(n - 3)
}
// 非递归写法
const jump = n => {
if (n <= 2) {
return n
}
if (n === 3) {
return 4 // jump(1)+jump(2)+1
}
let [first, second, third] = [1, 2, 4]
let count = 4
while (count++ <= n) {
;[first, second, third] = [second, third, first + second + third]
}
return third
}
// 输出前10个:
/*
1
2
4
7
13
24
44
81
149
*/
3. 题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,还可以跳上3级台阶,...一直可以跳到n级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?
/**
* 分析
* f(n) = f(n-1) + f(n-2) + ... + f(2) + f(1)
* f(n-1) = f(n-2) + f(n-2) + ... + f(2) + f(1)
* 得到 f(n) = 2 * f(n-1)
* 或者可以再进一步
* = 2^2 * f(n-2)
* ...
* = 2^(n-1) * f(1)
* = 2^(n-1)
*/
const jump = n => {
if (n <= 1) {
return n
}
return 2 * jump(n - 1)
// or
// return 2 ** (n - 1)
}
// 输出前10个:
/*
1
2
4
8
16
32
64
128
256
*/
4. 题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,还可以跳上3级台阶,...一直可以跳到m级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?(注意:n可能大于m也可能不大于)
/**
* 分析
* 1、如果m>=n,那么这个题目转化为上面的题3
* 2、如果m<n,那么先写出多项式
* f(n) = f(n-1) + f(n-2) + ... + f(n-m+1) + f(n-m)
* f(n-1) = f(n-2) + f(n-2) + ... + f(n-m) + f(n-m-1)
* 得到 f(n) = 2 * f(n-1) - f(n-m-1)
*/
const jump = (n, m) => {
if (n <= 1) {
return n
}
if (m >= n) {
return 2 * jump(n - 1, n)
}
return 2 * jump(n - 1, n) - jump(n - m - 1, m)
}
// 当 m = 2时,转化为第1题
// 输出前10得到:
// 经过我的测试,并不满足,不知道哪里出错了,还请高手指点一下!