递归算法说起来大家可能都能理解,大家看别人写的递归算法大致也能看懂,
但是如果真哪一个具体的问题给你让利用递归算法来实现可就不是那么容易了
递归算法大家说的最多的一句话就是自己调用自己,实际上它同样是一个循环,
只是它不是我们平时自己写的那种循环而已,它是利用数据结构中的栈来实现自己的循环的;
关于这个算法的精髓思想,不是光靠我一两句话就能把你讲通了,这得靠你自己对它进行深入的分析才能
运用自如,下面首先来讲递归算法中最经典的汉诺塔问题:
汉诺塔问题即为:
问题描述:
总共有三个圆柱A,B,C,一个圆柱A上从上到下共有n个盘子,并且每个盘子都是从上到下依次增大,问你怎莫将这些盘子从A借助B移到C柱上?
分析方法:
1,.n=1 ,直接将盘子移到C柱上;
2.n>1 ,从上到下依次给盘子编号为1,2,3............n,将(1,2, n-1)当做一个盘子,则可将问题分为两步
{
1,将(1,2,n-1)盘从A移到B上(借助C);
2,将 n盘移到C上
3 将(1,2,n-1)盘移到C上,完成整个事情;
}
实际上步骤一和·步骤3又是整个移动盘子过程的重复,只是重复时移动起始柱和终点柱不同而已;
这也就是递归算法的运用了;
下面是整个程序的源代码
/**********************************************
2014-5-15
author: jk
vc++6.0实现
**********************************************/
//递归调用之汉诺塔问题
#include <stdio.h>
//n为盘子的个数,A,B,C分别代表起始柱,终点柱,借助柱
void hanoi(int n,char A, char B, char C)//from A to B
{
if(1==n)//多数人容易犯n=1的错误,这样写不容易出错也容易查错
{
printf("put the %d from %c to %c\n",n,A,B);
return ;//递归调用出口
}
else
{
hanoi(n-1,A,C,B); //from A to C
printf("put the %d from %c to %c\n",n,A,B);
hanoi(n-1,C,B,A);//from C to B
}
}
void main()
{
int n;
printf("输入汉诺塔盘的数目,输出移动盘的过程: ");
scanf("%d",&n);
hanoi(n,'A','B','C');
}