都是通过栈来实现的,为了支持函数调用,编译器必需要建栈.没有栈的编译器无法支持函数调用
10年积累的成都网站设计、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有昌宁免费网站建设让你可以放心的选择与我们合作。
实际上编译器无法区分是否是递归函数,它只不过是按代码顺序执行,到达return fib(n-1)+fib(n-2);时实际已经经过了int fib(int n),相当于编译器已经得知这个函数是存在的,所以没有问题可以调用。
不管是不是递归函数,函数入栈都是在编译时完成的
递归具体用法其实就是让你把一个问题分解成很多个类似的情况,虽然你要解决这个问题非常难,莫名其妙,要你想几年,但是把他一直递归分解,就变成很好理解的单种情况,而你整个问题又是跟这个单种情况类似,把整个问题通过递归调用一层一层分解到最低级简单的那种情况,就是你所需要理解的了。
一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
(引自谭浩强的C语言书里)
用递归法计算n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n1)
具体如下long ff(int n)
{
long f;
if(n0) printf("n0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}
main()
{
int n;
long y;
printf("\ninput a inteager number:\n");
scanf("%d",n);
y=ff(n);
printf("%d!=%ld",n,y);
}
较难题:一块板上有三根针,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。如图5.4所示。要把这64个圆盘从A针移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。
具体如下move(int n,int x,int y,int z)
{
if(n==1)
printf("%c--%c\n",x,z);
else
{
move(n-1,x,z,y);
printf("%c--%c\n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("\ninput number:\n");
scanf("%d",h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
}
从程序中可以看出,move函数是一个递归函数,它有四个形参n,x,y,z。n表示圆盘数,x,y,z分别表示三根针。move 函数的功能是把x上的n个圆盘移动到z上。当n==1时,直接把x上的圆盘移至z上,输出x→z。如n!=1则分为三步:递归调用move函数,把n-1个圆盘从x移到y;输出x→z;递归调用move函数,把n-1个圆盘从y移到z。在递归调用过程中n=n-1,故n的值逐次递减,最后n=1时,终止递归,逐层返回。当n=4 时程序运行的结果为:
int recursive_combination(int n,int r){
if(nr)return 0;
if(r==0||r==n)return 1;
if(r==1)return n;
return recursive_combination(n-1,r-1)+
recursive_combination(n-1,r);
}
代码文本:
#include "stdio.h"
double fun(int n){
int m,s;
for(s=1,m=n;m--;s*=10);
return n1 ? 9.0/(7*s-25)+fun(n-1) : 0.2;
}
int main(int argc,char *argv[]){
int n;
printf("Enter n(int 0n11)...\nn=");
if(scanf("%d",n)==1 n0 n11)
printf("S(%d) = %.10g\n",n,fun(n));
else
printf("Input error, exit...\n");
return 0;
}