本文主要介绍了C语言中关于递归的相关信息,通过示例代码进行了详细介绍,对您的学习或工作有一定的参考价值。有需要的朋友下面和边肖一起学习。
什么是递归?
说到递归,如果不谈栈,我觉得有点不合适。递归的特点是不断调用同一个函数。如果这个函数没有递归边界,它就是一个无限循环。因此,在讨论递归时,必须讨论递归边界,即限制递归调用的次数。
让我们看一个例子
#include 'stdio.h '
int digui(无符号长计数)
{
如果(计数为0){
count-;
printf('%d \n ',count);
地轨(计数);
}
返回1;
}
int main()
{
地桂(10);
返回(100);
}
对这个递归函数的有限解释是
如果(计数为0){
所以他的通话顺序可以用这个图来说明。
这个过程叫做交割,也就是堆码的过程。既然有堆砌的过程就有堆砌的过程,堆砌的过程就是
如果(计数为0){
判断不成功后,将退出堆栈。如下图所示
可以执行多少次递归?
如上所述,由于堆栈是递归使用的,所以系统的堆栈大小必须有限制。系统不可能给你分配无限的堆栈大小。看了一些文章说栈大小是64K。
在上面的同一个例子中,我将传入数据设置为大执行。
#include 'stdio.h '
int tigui(无符号长计数)
{
如果(计数为0){
count-;
printf('%d \n ',count);
提格雷(伯爵);
}
返回1;
}
int main()
{
提桂(900000);
返回(100);
}
执行结果
所以递归的次数肯定是有限制的。
递归求阶乘
用递归求阶乘是经典的方法。让我们看一下代码。
# includestdio.h
int fact(无符号long n);//声明阶乘事实函数
int main(){
无符号长x;
scanf('%d ',x);
x=事实(x);//调用函数返回int值
printf('%ld\n ',x);
return(0);
}
Int fact(unsigned long n){//定义阶乘函数
if(n==1)返回1;//如果输入参数为1,直接返回1。
否则返回n * fact(n-1);//递归算法
}
执行结果
单看代码,我觉得还是有点拗口。我们来看一张图,看看他的叫声。假设我们要求5的阶乘。
递归和汉诺塔
河内塔(Hanoi Tower):河内塔(又称河内塔)是一种益智玩具,起源于一个古老的印度传说。梵天创造世界的时候做了三根钻石柱子,柱子上自下而上叠放了64个黄金圆盘。梵天命令梵天从下面按大小顺序重新排列另一根柱子上的圆盘。此外,还规定在小盘上不能放大盘,一次只能在三列之间移动一个盘。
如果是这样的话,我想大家应该觉得很简单。完成动作只需要三步。
1.把小盘放在第三根柱子上。
2.把中间的圆盘放在第二根柱子上。
3.把小盘放在第二根柱子上。
4.把大圆盘放在第三根柱子上。
5.把小圆盘放在第一根柱子上。
6.把中间的圆盘放在第三根柱子上。
7.把小盘放在第三根柱子上。
如图所示
以上分析是细分法,移动的核心思想分三步走。
1.将第一个立柱上的n-1磁盘移到第二个立柱上。
2.将第一列的第n个磁盘移到第三列。
3.将第二列的n-1个磁盘移到第三列。
所以递归出现了。
1.将第一列的n-1个磁盘“递归”移动到第二列。
2.将第一列的第n个磁盘移到第三列。
3.将第二列的n-1个磁盘“递归地”移动到第三列。
c语言代码实现
#包含stdio.h
#包含windows.h
void Hanoi(int n,char a,char b,char c);
void Move(int n,char a,char b);
int计数;
int main()
{
int n=8;
Printf('河内塔的层数:\ n ');
scanf(' %d ',n);
Hanoi(n,' A ',' B ',' C ');
printf('退出主.\ n’);
返回0;
}
void Hanoi(int n,char a,char b,char c)
{
如果(n==1)
{
Move(n,a,c);
}
其他
{
河内(n - 1,a,c,b);/*把n-1从a柱子放到b柱子上面*/
Move(n,a,c);/*把n从a移动到c上*/
河内(n - 1,b,a,c);/*把n - 1通过a的辅助作用从b移动到c上*/
}
}
void Move(int n,char a,char b)
{
数数;
printf('第%d次移动移动%d:从%c位置移动到%c!\n ',count,n,a,b);
}
输出如图所示
加强版修改
加强了下软件写法,好好看代码,写的有点太快,没细想,后面再完善。
#包含标准视频
/*柔性数组*/
typedef struct _soft_array{
int len
(同Internationalorganizations)国际组织数组[];
}软数组
/*汉诺塔结构体*/
typedef struct _ hannuo {
软数组* p数据
字符名称;
}汉诺;
hannuo * han _ a=NULL
hannuo * han _ b=NULL
hannuo * han _ c=NULL
void hannoiii(int n,hanno * a,hanno * b,hanno * c);
void moveiii (int n,hanno * a,hanno * c);
int合计
void printf _ Han _ data(hanno * Han)
{
int I=0;
printf('%c:',Han-name);
/*输出汉诺塔的数据*/
for(I=0;ihan-p _ data-len;我)
{
printf('%d-',Han-p _ data-array[I]);
}
printf(' \ n ');
}
int main()
{
int I=0;
int n=0;
scanf(' %d ',n);
total=n;
/*定义三个汉诺塔节点*/
韩_a=(汉诺*)malloc(sizeof(汉诺));
Han _ A-name=' A ';
Han _ a-p _ data=(soft _ array *)malloc(sizeof(soft _ array)sizeof(int)* n);
Han _ a-p _ data-len=n;
/*数据原来在第一根柱子上*/
for(I=0;在;我)
{
Han _ a-p _ data-array[I]=I 1;
}
printf _ Han _ data(Han _ a);
/*初始化第二根柱子*/
韩_b=(汉诺*)malloc(sizeof(汉诺));
Han _ B-name=' B ';
Han _ b-p _ data=(soft _ array *)malloc(sizeof(soft _ array)sizeof(int)* n);
memset(han_b-p_data,0,sizeof(soft _ array)sizeof(int)* n);
Han _ b-p _ data-len=n;
printf _ Han _ data(Han _ b);
/*初始化第三根柱子*/
han_c=(汉诺*)malloc(sizeof(汉诺));
Han _ C-name=' C ';
Han _ c-p _ data=(soft _ array *)malloc(sizeof(soft _ array)sizeof(int)* n);
memset(han_c-p_data,0,sizeof(soft _ array)sizeof(int)* n);
Han _ c-p _ data-len=n;
printf _ Han _ data(Han _ c);
printf('-\ n ');
hannoiii(n,han_a,han_b,Han _ c);
printf(' \ n ');
返回0;
}
void hannoiii(int n,hannuo * a,hannuo * b,hannuo * c)
{
如果(n==1)
{
a-p _ data-array[0]=0;
c-p _ data-array[0]=1;
printf _ Han _ data(Han _ a);
printf _ Han _ data(Han _ b);
printf _ Han _ data(Han _ c);
printf('-\ n ');
}
其他
{
汉诺伊尔(n - 1,a,c,b);/*把n-1从a柱子放到b柱子上面*/
moveiii(n,a,c);/*把n从a移动到c上*/
printf _ Han _ data(Han _ a);
printf _ Han _ data(Han _ b);
printf _ Han _ data(Han _ c);
printf('-\ n ');
汉诺伊尔(n - 1,b,a,c);/*把n - 1通过a的辅助作用从b移动到c上*/
}
}
void moveiii (int n,hannuo * a,hannuo * c)
{
int I=0;
int tmp=a-p _ data-array[n-1];
a-p _ data-array[n-1]=0;
#如果一
c-p _ data-array[n-1]=tmp;
#否则
for(I=0;我总计;我)
{
if(c-p_data-array[i]==0){
c-p _ data-array[I]=tmp;
打破;
}
}
#endif
}
到此这篇关于C语言中递归的文章就介绍到这了,更多相关C语言的递归内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。