成都创新互联网站制作重庆分公司

c语言递归计算函数,c语言递归函数的概念及用法

C语言函数递归计算

#include stdio.h

成都创新互联公司专注于同心企业网站建设,成都响应式网站建设公司,商城系统网站开发。同心网站建设公司,为同心等地区提供建站服务。全流程按需定制,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务

#include stdlib.h

int count=0;

int fun(int x,int n)

{

count++;

if(n==2)

{

return x*x;

}

else if(n%2==0)

{

return fun(x,n/2)*fun(x,n/2);

}

else if(n%2==1)

{

return fun(x,n-1)*x;

}

}

int main(int argc, char *argv[]) {

int sum=0,x,n;

printf("请输入x n的值(两数之间用空格间隔):");

scanf("%d %d",x,n);

sum=fun(x,n);

printf("%d  递归调用了%d次",sum,count);

return 0;

}

C语言:递归函数

使用递归的方法,系统会为你这个递归问题分配一个栈空间,这个栈空间的大小是有限制的;然后,系统会把那些暂时不能计算的函数,地址以及参数入栈,直到递归条件成立的时候,才一个个的出栈;所以你那个问题的根本原因是:堆栈空间不够的问题;

你可以看看系统堆栈的大小,比如你在main函数里面这样写:

int x,y;

printf("x:0x%x,y:0x%x\n",x,y);

看看这里面的x,y的地址是咋样的,就知道了;在PC里面,栈是倒立放着的,也就是说栈底的地址要大,所以根据这个,就可以估计出系统分配的栈空间大概有多大;然后,你就可以估计递归的深度有多少了。

需要说明的是:不同函数的递归,递归深度是不同的;因为,每个函数占用的栈空间大小不同;

在平时编程的时候,不建议使用递归方法,你可以在堆里面自定义一个栈,然后把递归算法改写成非递归的方法。

你可以在Visual C++ 6.0 里面建立一个控制台Win32程序,增加异常处理代码,头文件

#include exception.h

try{

return_function();

}catch(runtime_exception){ //这里记得不太清楚,自己搜搜看

//打印出问题

}

个人建议:你要学习c++的话,研究一下《c++ primer》和《深入浅出的MFC》;对于你这些类似的问题,可以搜索:堆分配,栈分配,异常,__thiscall,__stdcall 等关键字,多了解了解

c语言递归函数

递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。

递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素:

(1)边界条件:确定递归到何时终止,也称为递归出口。

(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果

汉诺塔问题:对汉诺塔问题的求解,可以通过以下3个步骤实现:

(1)将塔上的n-1个碟子借助塔C先移到塔B上;

(2)把塔A上剩下的一个碟子移到塔C上;

(3)将n-1个碟子从塔B借助塔A移到塔C上。

在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。采用图示方法描述递归函数的运行轨迹,从中可较直观地了解到各调用层次及其执行情况,具体方法如下:

(1)写出函数当前调用层执行的各语句,并用有向弧表示语句的执行次序;

(2)对函数的每个递归调用,写出对应的函数调用,从调用处画一条有向弧指向被调用函数入口,表示调用路线,从被调用函数末尾处画一条有向弧指向调用语句的下面,表示返回路线;

(3)在返回路线上标出本层调用所得的函数值。n=3时汉诺塔算法的运行轨迹如下图所示,有向弧上的数字表示递归调用和返回的执行顺序

三、递归函数的内部执行过程

一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:

(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;

(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;

(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。

上述汉诺塔算法执行过程中,工作栈的变化如下图所示,其中栈元素的结构为(返回地址,n值,A值,B值,C值),返回地址对应算法中语句的行号,分图的序号对应图中递归调用和返回的序号

我可以帮助你,你先设置我最佳答案后,我百度Hii教你。

c语言函数递归的算法

这是一个递归调用fun(x)的算法。

首先会计算x=1时,因为x是int型,所以x/2==0,返回1,所以打印1.

然后再计算x=2时,这时返回x%2=0,所以打印0;

再计算x=4时,同样返回x%2=0,所以打印0;

最后计算x=8时,返回x%2=0,所以打印0。

所以屏幕输出的就显示1000 。


当前文章:c语言递归计算函数,c语言递归函数的概念及用法
地址分享:http://cxhlcq.com/article/hohidj.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部