递归函数c语言特点 c中递归函数

给我解释一下C语言递归函数?额,抽象递归函数c语言特点的说就是解决一个问题时重复使用一个动作,那么就可以用递归递归函数c语言特点的方式来解决,告诉电脑重复做这个动作就行.结合看一些递归算法递归函数c语言特点的简单程序,应该好懂些.
在c语言中递归和迭代有什么区别和联系各自的优缺点是什么二者分别适合解决什?能力有限递归函数c语言特点 , 仅知几点
两者都是重复某一操作直到满足条件为止 。
不同之处在于递归函数c语言特点,递归是函数调用自身,而迭代是使用循环 。
某些情况下递归更加简单 , 可读性更高 , 而用循环则十分复杂 。如二分法,快速排序等 。
递归很容易导致栈溢出,导致程序崩溃 , 而循环不会 。
综上所述,能用循环用循环,递归是万不得已的手段 。
C语言递归算法?本人学c递归函数c语言特点,c的语法已经淡忘了递归函数c语言特点,但是递归不管什么语言都是一个原理
其实简单一点来说就像数学里面的数列的通项公式递归函数c语言特点:
例如一个数列是2,4 , 6,8,10......
很容易就可以得到通项公式是a[n]=2*n n是大于0的整数
你肯定学过这个数列的另外一种表示方式就是: a[1]=2, a[n]=a[n-1] 2 n是大于1的整数
其实这就是一个递归的形式,只要你知道初始项的值 , 未知项和前几项之间的关系就可以知道整个数列 。
程序例子:比如你要得到第x项的值
普通循环:
for(int i=1; i=n; i)
if (i == x)
cout2*i; /*cout 相当于 c里面的printf,就是输出.*/
递归:
int a(int x) {
if (x = 1)
return 2; /* 第一项那肯定是2了,这个也是递归的终止条件! */
else return a(x-1) 2; /* 函数自身调用自身是递归的一个特色 */
比如x=4,那么用数学表示就是a(4)=a(3) 2=(a(2) 2) 2=((a(1) 2) 2) 2
其实递归方法最接近自然,也是最好思考的一个方法,难点就是把对象建模成递归形式 , 但是好多问题本身就是以递归形式出现的 。
普通递归就是数据结构上的堆栈,先进后出 。
例如上面x=4,把a(4)放入栈底,然后放入a(3),然后a(2),a(1),a(1)的值已知,出栈,a(1)=2,a(2)出栈a(2)=a(1) 2=2 2=4,a(3)出栈a(3)=a(2) 2=(a(1) 2) 2=6,a(4)出栈a(4)=a(3) 2=(a(2) 2) 2=((a(1) 2) 2) 2=8
再比如楼上的阶乘例子,当n=0 或 1时,0!=1,1!=1,这个是阶乘的初始值,也是递归的终止条件 。然后递归函数c语言特点我们知道n!=n*(n-1)!,当n1时,这样我们又有了递归形式,又可以以递归算法设计程序了 。(楼上已给出谭老的程序,我就不写了) 。
我给出一种优化的递归算法---尾递归 。
从我给出的第一算法可以看出,先进栈再出栈,递归的效率是很低的 。速度上完全比不上迭代(循环) 。但是尾递归引入了一个新的函数参数,用这个新的函数参数来记录中间值.
普通递归阶乘fac(x),就1个x而已,尾递归用2个参数fac(x,y),y存放阶乘值 。
所以谭老的程序就变成
// zysable's tail recursive algorithm of factorial.
int fac(int x, int y) {
if (x == 1)
return y;
else return fac(x-1, y*x);}
int ff(int x) {
if (x == 0)
return 1;
else return fac(x,1);}
对于这个程序我们先看函数ff,函数ff其实是对fac的一个封装函数 , 纯粹是为了输入方便设计的,通过调用ff(x)来调用fac(x,1),这里常数1就是当x=1的时候阶乘值了,我通过走一遍当x=3时的值即为3!来说明一下 。
首先ff(3),x!=0,执行fac(3,1).第一次调用fac , x=3,y=1,x!=1,调用fac(x-1,y*x),新的x=2,y=3*1=3,这里可以看到,y已经累计了一次阶乘值了,然后x还是!=1,继续第三次调用fac(x-1,y*x),新的x=1,y=2*3=6,然后x=1了 , 返回y的值是6,也就是3!.你会发现这个递归更类似于迭代了 。事实上我们用了y记录了普通递归时候,出栈的乘积,所以减少了出栈后的步骤 , 而且现在世界上很多程序员都在倡议用尾递归取消循环,因为有些在很多解释器上尾递归比迭代稍微效率一点.
基本所有普通递归的问题都可以用尾递归来解决 。
一个问题以递归来解决重要的是你能抽象出问题的递归公式,只要递归公式有了,你就可以放心大胆的在程序中使用 , 另外一个重点就是递归的终止条件;
其实这个终止条件也是包含在递归公式里面的,就是初始值的定义 。英文叫define initial value. 用普通递归的时候不要刻意让自己去人工追踪程序,查看运行过程,有些时候你会发现你越看越不明白,只要递归公式转化成程序语言正确了,结果必然是正确的 。学递归的初学者总是想用追踪程序运行来让自己来了解递归,结果越弄越糊涂 。
如果想很清楚的了解递归,有种计算机语言叫scheme,完全递归的语言,因为没有循环语句和赋值语句 。但是国内人知道的很少,大部分知道是的lisp 。
好了 , 就给你说到这里了 , 希望你能学好递归 。
PS:递归不要滥用,否则程序极其无效率,要用也用尾递归 。by 一名在美国的中国程序员zysable 。
请问下c语言中函数的嵌套和递归怎么区别区别:函数嵌套是语言特性 , 递归调用是逻辑思想 。这两者有关,但并不互斥 。一个递归过程可以包含函数嵌套 。同样,一个递归函数也可当做是自身嵌套函数 。
函数嵌套允许在一个函数中调用另外一个函数,比如有三个函数:
func1()
【递归函数c语言特点 c中递归函数】{
func2();
}
func2()
{
func3();
}
func3()
{
printf("Hello");
}
这个就叫做嵌套调用,它是一个语言提供的程序设计的方法 , 也就是语言的特性 。
而递归,是一种解决方案,一种思想,将一个大工作分为逐渐减小的小工作,比如说一个人要搬50块石头,他想 , 只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了……以此类推的思考,递归是一种思想,只不过在程序中 , 就是依靠函数嵌套这个特性来实现了 。
递归最明显的特点就是,自己调用自己(就是函数嵌套调用) 。如下例
funca()
{
if(statement1)
funca();
else
exit(0);
}
概括说,函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,使函数嵌套的一个特例 。
C语言中递归函数用的多不多?什么地方会涉及到这个?学此专业的人应该掌握到那种地步?一、基本内容:
C语言中的函数可以递归调用 , 即:可以直接(简单递归)或间接(间接递归)地自己调自己 。
要点:
1、C语言函数可以递归调用 。
2、可以通过直接或间接两种方式调用 。目前只讨论直接递归调用 。
二、递归条件
采用递归方法来解决问题,必须符合以下三个条件:
1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减 。
说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用 。
2、可以应用这个转化过程使问题得到解决 。
说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题 。
3、必定要有一个明确的结束递归的条件 。
说明:一定要能够在适当的地方结束递归调用 。不然可能导致系统崩溃 。
三、递归实例
例:使用递归的方法求n!
当n1时 , 求n!的问题可以转化为n*(n-1)!的新问题 。
比如n=5:
第一部分:5*4*3*2*1 n*(n-1)!
第二部分:4*3*2*1 (n-1)*(n-2)!
第三部分:3*2*1 (n-2)(n-3)!
第四部分:2*1 (n-3)(n-4)!
第五部分:1 (n-5)! 5-5=0,得到值1,结束递归 。
源程序:
fac(int n)
{int t;
if(n==1)||(n==0) return 1;
else
{ t=n*fac(n-1);
return t;
}
}
main( )
{int m,y;
printf(“Enter m:”);
scanf(“%d”,m);
if(m0) printf(“Input data Error!\n”);
else
{y=fac(m);
printf(“\n%d! =%d \n”,m,y);
}
}
四、递归说明
1、当函数自己调用自己时,系统将自动把函数中当前的变量和形参暂时保留起来,在新一轮的调用过程中 , 系统为新调用的函数所用到的变量和形参开辟另外的存 储单元(内存空间) 。每次调用函数所使用的变量在不同的内存空间 。
2、递归调用的层次越多,同名变量的占用的存储单元也就越多 。一定要记住 , 每次函数的调用,系统都会为该函数的变量开辟新的内存空间 。
3、当本次调用的函数运行结束时,系统将释放本次调用时所占用的内存空间 。程序的流程返回到上一层的调用点,同时取得当初进入该层时,函数中的变量和形参 所占用的内存空间的数据 。
4、所有递归问题都可以用非递归的方法来解决 , 但对于一些比较复杂的递归问题用非递归的方法往往使程序变得十分复杂难以读懂,而函数的递归调用在解决这类 问题时能使程序简洁明了有较好的可读性;但由于递归调用过程中,系统要为每一层调用中的变量开辟内存空间、要记住每一层调用后的返回点、要增加许多额外的 开销,因此函数的递归调用通常会降低程序的运行效率 。
五、程序流程
fac(int n) /*每次调用使用不同的参数*/
{ int t; /*每次调用都会为变量t开辟不同的内存空间*/
if(n==1)||(n==0) /*当满足这些条件返回1 */
return 1;
else
{ t=n*fac(n-1); /*每次程序运行到此处就会用n-1作为参数再调用一次本函数,此处是调用点*/
return t; /*只有在上一句调用的所有过程全部结束时才运行到此处 。*/
}
}
关于递归函数c语言特点和c中递归函数的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读