当前位置:首页 » 编程语言 » c语言中的双重递归调
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言中的双重递归调

发布时间: 2022-06-24 20:00:01

㈠ 讲一下c语言中递归函数的使用方法

相当于循环,要有判断条件,传递进去的参数要变化,满足条件调用自身,不满足条件就开始一层一层返回。简单例子:
int
f(int
i){
int
sum=0;
if(i>0)
sum+=f(i-1);
return
sum;
}
main(){
int
a=10;
printf("%d",f(a));
}

㈡ C语言中递归调用的实例以及讲解。

下面演示一个斐波那契数列前N项和#include <stdio.h>
#define COL 10 //一行输出10个
long scan()
{ //输入求fibonacci函数的第N项
int n;
printf("Input the N = ");
scanf("%d",&n);
return n;
}
long fibonacci(int n)
{ //fibonacci函数的递归函数
if (0==n||1==n) { //fibonacci函数递归的出口
return 1;
}
else {
return fibonacci(n-1)+fibonacci(n-2);
//反复递归自身函数直到碰到出口处再返回就能计算出第n项的值
}
}
int main(void)
{
int i,n;
n = scan();
printf("Fibonacci数列的前%d项\n", n);
for (i=0; i<n;) //输出fibonacci函数前n项每项的值
{
printf("%-10ld",fibonacci(i++)); //调用递归函数并且打印出返回值
if(i%COL==0)
{ //若对COL取余等于0就换行,也就是控制每行输出多少个,
//而COL=10就是每行输出10个
printf("\n");
}
}
printf("\n");
return 0;
}

㈢ C语言里函数递归调用该怎样理解

那你这样想吧。数学中不是有递推公式吗。比如:A1=1, An=An-1 +2。那么你用递归就是要想求An,只要An-1求出来,只要加2就是An啦。以此类推,只要知道A1就行啦。
int labi(int n)
{
if(n==1) return(1);
else return(labi(n-1)+2);
}

main()
{
int n,t;
scanf("%d",&n);
t=labi(n);
printf("%d\n",t);
}

㈣ C语言中递归调用是什么怎么回事。。

写一个函数,在这个函数里呢调用自己本身这个函数,直到符合某个条件为止,然后一层一层返回出来,这样的函数调用就叫递归调用
比如说,第一数是2,第二个数是第一个的4倍,第三个是第二个的4倍,依次到第十个数,请问第十个数是多少,就可以用递归了

㈤ C语言中的递归是什么意思

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。



(5)c语言中的双重递归调扩展阅读:

递归的应用

1、数据的定义是按递归定义的。(Fibonacci函数)

2、问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

3、数据的结构形式是按递归定义的。

递归的缺点

递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。


㈥ 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)
cout << 2*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,这个是阶乘的初始值,也是递归的终止条件。然后我们知道n!=n*(n-1)!,当n>1时,这样我们又有了递归形式,又可以以递归算法设计程序了。(楼上已给出谭老的程序,我就不写了)。
我给出一种优化的递归算法---尾递归。
从我给出的第一算法可以看出,先进栈再出栈,递归的效率是很低的。速度上完全比不上迭代(循环)。但是尾递归引入了一个新的函数参数,用这个新的函数参数来记录中间值.
普通递归阶乘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语言的递归调用问题。

函数其实没有释放内存的概念,因为函数都是在指令区,而不是通常所说的释放内存对应的数据区,不过在整个程序执行完之后指令区也是要释放的。
函数调用的大概过程如下:
1,将调用函数的上下文入栈;
2,调用被调用函数;
3,被调换函数执行;
4,调用函数上下文出栈,继续执行后继指令。
所以在函数调用过程中原调用函数是不会退出的-----即你所说的释放内存。
具体到你给的代码:
首先main中调用test,
进入test后要求读入一个char,
你输入'1'后执行case
'1'中语句,所以输出“已调用”,然后就执行test()语句,即递归调用,此时main调用的test要等新的test执行完毕才能继续执行后继的i++语句;
再次进入test之后与从main中进入时一样,如果输入的是'1'会接着递归调用test,由于你输入了5次1,所以会继续调用5次test;
在最后一个test中你输入了ESC?
所以不再走case
'1'而走default了,所以输出"222222";
switch执行完之后判断c==27满足,所以while循环退出,继续执行printf语句,由于之前的test统统没有执行过case
1里的i++语句,所以全局变量i还是0;输出i=0;
到此最后一次test执行完毕;
倒数第二次的test继续执行i++,
所以i=2了,case
1执行完毕,但由于没有写break语句,所以继续执行default
语句,输出"222222",
退出switch语句,判断c==27,
由于c是全局变量,且最后一次输入的刚好是ESC,
所以判断满足,
退出while循环,输出i=1,
到此倒数第二次test执行完毕;
与倒数第二次类似的继续执行倒数第三、倒数第四、倒数第五和最终的第一次test后继代码,也就输出如你列出的结果了。

㈧ c语言函数递归调用

我给你举个简单的例子你就明白了,你可以假设n=3
然后代入这个函数,a(3)=a(2)+5;而a(2)=a(1)+5;a(1)=1
所以最后就是a(3)=1+5+5=11…
同理你可以算出a(10)=1+5*9=46

满意请采纳

㈨ 请问这里面的双重递归怎么去理解,或者这是属于什么方面的知识,我刚大一,C语言学了一学期,求大神。

哪里面的?双重递归就是在一个递归函数里两次调用自身。

比如求解斐波那契数列的时候f(n)=f(n-1)+f(n-2).