一、汉诺塔问题
问题描述
给定三根柱子,柱子A上放了n个圆盘(下面大,上面小),要求将n个圆盘搬移到C,始终保持小圆盘在大圆盘上面。
分析
- 若只有1个圆盘,则直接从A搬移到C
- 若有2个圆盘,则将第一个圆盘从A搬移到B,再把第二个圆盘从A移到C,最后将B柱子上的圆盘移到C
- 若有n个圆盘(n > 1),则先以柱子C为中介,将上面 n-1 个圆盘搬移到B,将A上的1个圆盘移到C,再将B上的n-1个圆盘移到C
代码实现
#include <bits/stdc++.h>
using namespace std;
void hanoi(int n, char A, char B, char C){
if (n == 1){
cout << A << " -> " << C << endl;
return;
}
hanoi(n-1, A, C, B);
hanoi(1, A, B, C);
hanoi(n-1, B, A, C);
}
int main()
{
hanoi(3, 'A', 'B', 'C');
return 0;
}
总结:递归终止条件 + 状态过渡方程
二、跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
递归设计
- 终止条件:只有1级台阶时(1种跳法);只有2级台阶时(2种跳法)
- 过度方程:jumpFloor(n) = jumpFloor(n-1) + jumpFloor(n-2) —— 最后一步跳2级或跳1级台阶
代码实现
class Solution {
public:
int jumpFloor(int number) {
if (number == 1)
return 1;
else if (number == 2)
return 2;
else
return jumpFloor(number-1)+jumpFloor(number-2);
}
};