汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
如图:
#include<stdio.h>
void Hanoi(int n,char a,char b,char c);
void Move(int n,char a,char b);
int main()
{
int n;
printf("Input the number of disks:");
scanf("%d",&n);
printf("Steps of moving %d disks from A to B by means of C:\n",n);
Hanoi(n,'A','B','C'); //将n个圆盘借助c由A已到B
return 0;
}
/*函数功能:用递归方法将n个圆盘借助柱子C从原柱子a移动到目标柱子b上*/
void Hanoi(int n,char a,char b,char c)
{
if(n==1)
{
Move(n,a,b); //将第n个圆盘由a移动到b
}
else
{
Hanoi(n-1,a,c,b); //将第n-1个圆盘借助柱子b由a移动到c
Move(n,a,b); //第n个圆盘由a移动到b
Hanoi(n-1,c,b,a); //将第n-1个圆盘借助a由c移动到b
}
}
/*函数功能:将第n个圆盘由原柱子a移动到b*/
void Move(int n,char a,char b)
{
printf("Move %d:from %c to %c\n",n,a,b);
}
总结:
1.当问题的解决过程有明显的相似的结构时(类似循环,但内容和循环次数不确定(简单来说循环不好解决)),可以使用递归思想。
2.递归可以将规模较大的过程缩减,考虑得到结果的n-1步,再依照条件考虑n-2步的条件…直到第一步。