汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
如果挪动两个盘子:那么挪动的方式应该是:A->B A->C B->C
如果挪动三个盘子:
则挪动方式为:A->C A->B C->B A->C B->A B->C A->C这七步。
如果 A上有x个盘子,就需要把x-1个盘子通过C挪动到B上,再把A最后剩余的一个盘子挪到C盘,再把B上的x-1个盘子通过A再挪到C盘上。
代码如下:
#include <stdio.h>
void move(char pose1, char pose2)
{
printf("%c->%c ", pose1, pose2);
}
//x代表盘子个数,pose1代表起始位置,pose2代表中转位置,pose3代表目的位置
void hanuota(int x, char pose1, char pose2, char pose3)
{
if (x == 1)
{
move(pose1, pose3);
}
else
{
hanuota(x - 1, pose1, pose3, pose2);//将A上的x-1个盘子通过C挪到B上去
move(pose1, pose3);//将A上的一个盘子挪到C上
hanuota(x - 1, pose2, pose1, pose3);//将B上的x-1个盘子通过A挪到C上
}
}
int main()
{
hanuota(3, 'A', 'B', 'C');
}
结果如下:
想使用多个盘子就只需要改变main()中的数字即可。
青蛙跳台阶问题:
一只青蛙可以一次跳 1 级台阶或一次跳 2 级台阶, 问要跳上第 n 级台阶有多少种跳法?
如果有一节台阶时,有一种跳法。
如果有两节台阶时,就有两种跳法。
那么有三节台阶时,有三种跳法。
四节台阶有五种跳法。
四节台阶图
1
如果青蛙第一次上了一节台阶,上面还有三节台阶,有三种跳法
2
如果青蛙第一次上了两节台阶,上面还有两节节台阶,有两种跳法,所以一共有五种跳法。
我么们可以以一节和两节为跳板,看剩余的台阶数。
所以我们发现规律为:n节台阶数就是n-1与n-2台阶数的和。
代码如下:
#include <stdio.h>
int qing(int m)
{
if (m == 1)
return 1;
else if (m == 2)
return 2;
else
return qing(m - 1) + qing(m - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = qing(n);
printf("%d", ret);
}
递归的两个经典问题已经讲解完成。