青蛙跳台阶的问题引出的算法分析
青蛙跳台阶的问题:一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法?
那么如果我们用分治法的思路思考的话,这道题真是非常容易理解。
首先,当青蛙在面对第一个台阶时,他只有两种选择 —— 跳一步还是跳两步。如果我们定义 f(n) 代表青蛙跳跃到 n 层台阶一共的方法数,那么我们可以将问题进行分解两个规模更小,但形式相同的问题:
C++
f(n) = f(n - 1) + f(n - 2)
其中 f(n-1) 是青蛙选择跳一步后,剩下的子问题,同理 f(n-2) 是青蛙选择跳两步后剩下的子问题。这样,我们就把问题进行了分解。
下面再谈谈如何解决,正如上面谈到的解决步骤,如果规模足够小那么直接返回,否则继续降低规模进行递归求解。这时,就是我们要确定边界条件——即当 n = 1 和 n = 2 时的情况。
在明确了边界条件后,合并就非常的简单,也就是简单的相加即可。
那么代码写出来是什么样子呢?
C++
#include <iostream>
using namespace std;
int f(int n) {
// 边界条件(解决)
if (n < 1) return 0; // 当台阶数目小于1时,那么就返回0种方案数量
if (n == 1) return 1; // 当台阶数目为1时,问题的规模已经足够小,我们可以直接想出他的方案数量—— 即1种:1步
if (n == 2) return 2; // 当台阶数目为2时,他的方案数量为2种,即—— 1步+1步,2步
return f(n - 1) + f(n - 2); // 分解并合并
}
int main() {
cout<<f(4)<<endl;
return 0;
}