递归函数
定义:即自调用函数,在函数体内部自己调用自己,即函数的嵌套调用函数本身。
机制: 函数不能嵌套定义但能嵌套调用,且调用函数和被调用函数相互独立;
发生函数调用时,被调用函数保存了调用函数的入口地址和参数,可在函数调用完成后返回;
被调函数运行的代码虽是同一个函数的代码体,但由于调用点,调用时状态, 返回点的不同,可以看作是函数的一个副本,与调用函数的代码无关,所以函数的代码是独立的。
被调函数运行的栈空间独立于调用函数的栈空间
递归调用的形式
直接调用和间接调用
递归的条件
(1)须有完成函数任务的语句。-->return (n*p);
(2)—个确定是否能避免递归调用的测试,如果不满足条件,就不进行递归调用。-->if(n<=1) return (1);
(3)一个递归调用语句。
该递归调用语句的参数应该逐渐逼近不满足条件,以至最后断绝递归。-->fact(n-1);
(4)先测试,后递归调用。,递归调用是有条件的,满足了条件后,才可以递归。
递归调用--栈的引用
根据栈的“先进后出”的性质,外围的函数调用的地址和返回参数先入栈,嵌套的函数依次入栈,等到出栈。
经典递归--汉诺塔
解析
将n-1个盘子移动到空出来的塔,然后将第n个盘子移动的目标塔c塔。
#include <stdio.h>
//第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔
int i=1;//记录步数
void move(int n,char from,char to) //将编号为n的盘子由from移动到to
{printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to);
}
void hanoi(int n,char from,char denpend_on,char to)//将n个盘子由初始塔移动到目标塔(利用借用塔)
{
if (n==1)
move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地
else
{
hanoi(n-1,from,to,denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
move(n,from,to); //将剩下的一个盘子移动到目的塔上
hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上
}
}
void main()
{
printf("请输入盘子的个数:\n");
int n;
scanf("%d",&n);
char x='A',y='B',z='C';
printf("盘子移动情况如下:\n");
hanoi(n,x,y,z);
}
参考资料:
http://www.cnblogs.com/seaven/archive/2010/12/17/1908953.html
http://wenku.baidu.com/link?url=StcdAzAwIw1aeyQvWChXvMyG04yBgZljnd2UaJIPp4rkqOhz20wah0Mpdo4fpjqYDNrEicjdPcWVSuvXfg6tmQQN_-K_910PcuoLbCLgncG
http://blog.csdn.net/kkkkkxiaofei/article/details/8333644/