【飞鸽传书】青蛙上台阶问题-归纳总结

309 阅读1分钟

简介

本文给出青蛙上台阶问题的终极解答,给出通用模板。

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得到:
// 经过我的测试,并不满足,不知道哪里出错了,还请高手指点一下!