递归函数有什么特点(在计算机内实现递归算法的特点 数据结构期末开始的考题急急急)
本文目录
在计算机内实现递归算法的特点 数据结构期末开始的考题急急急
递归算法的特点?1.编程容易,只需要考虑边界条件和递推方程。2.效率低,因为重复进入函数会有入栈出栈的损耗,远远比不上非递归。一般在函数内部消耗远大于出入函数消耗的时候才可以放心用。
递归算法有何特点
递归4—递归的弱点之所以没有把这段归为算法的讨论,因为这里讨论的不在是算法,而只是讨论一下滥用递归的不好的一面。递归的用法似乎是很容易的,但是递归还是有她的致命弱点,那就是如果运用不恰当,滥用递归,程序的运行效率会非常的低,低到什么程度,低到出乎你的想像!当然,平时的小程序是看不出什么的,但是一旦在大项目里滥用递归,效率问题将引起程序的实用性的大大降低!例子:求1到200的自然数的和。第一种做法:#include 《stdio.h》void main(){ int i; int sum=0;for(i=1;i《=200;i++) { sum+=i; }printf(“%d\n“,sum);}该代码中使用变量2个,计算200次。再看下个代码:#include 《stdio.h》int add(int i){ if(i==1) { return i; } else { return i+add(i-1); }}void main(){ int i; int sum=0;sum=add(200);printf(“%d\n“,sum);}但看add()函数,每次调用要声明一个变量,每次调用要计算一次,所以应该是200个变量,200次计算,对比一下想想,如果程序要求递归次数非常多的时候,而且类似与这种情况,我们还能用递归去做吗?这个时候宁愿麻烦点去考虑其他办法,也要尝试摆脱递归的干扰。21:21 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它 | 计算机与 Internet程序算法5—递归3—递归的再次挖掘递归的魅力就在于递归的代码,写出来实在是太简练了,而且能解决很多看起来似乎有规律但是又不是一下子能表达清楚的一些问题。思路清晰了,递归一写出来问题立即就解决了,给人一重感觉,递归这么好用。我们在此再更深的挖掘一下递归的用法。之前再强调一点,也许有人会问,你前边的例子用递归似乎是更麻烦了。是,是麻烦了,因为为了方便理解,只能举一些容易理解的例子,一般等实际应用递归的时候,远远不是这种状态。好了我们现在看一个数字的序列;有一组数的集合{1,2,4,7,11,16,22,29,37,46,56……}我故意多给几项,一般是只给前4项让你找规律的。序列给了,要求是求前50项的和。规律?有?还是没有?一看就象有,但是又看不出来,我多给了几项,应该很快看出来了,哦,原来每相邻的两项的差是个自然数排列,2-1=1,4-2=2,7-4=3,11-7=4,16-11=5……好了,把规律找出来了,一开始可能觉得没头绪,没问题,咱们把这个序列存放到一个数组总可以吧!那我们就声明一个数组,存放前50个数据,一个一个相加总可以了。于是有了下边的写法:#include 《stdio.h》void main(){ int i,a,sum=0;a=1; for(i=1;i《50;i++) { a);}printf(“\n“);}这段代码中的数组,声明大了浪费内存空间,声明小了又怕不够,所以写这种代码的人一般写完之后会祈祷,祈祷测试的人不要输入的太多,太多就不能完全显示了!与其这么提心吊胆,于是又有人想出了第二种方法,终于解决了一些问题,而且完全实现了程序的实际要求,于是,这种人经过一番苦想,觉得问题终于可以解决了,这种方法看起来是一种很不错的方法。#include 《stdio.h》#include 《malloc.h》void main(){int i; char *c;c=(char *)malloc(1*sizeof(char));for(i=0;;i++){ *(c+i)=getchar(); if(*(c+i)==’\n’) { *(c+i)=’\0’; break; } else c=(char *)realloc(c,(i+2)*sizeof(char));}for(--i;i》=0;i--){ putchar(*(c+i));}printf(“\n“);free(c);}怎么样?不错,准确的应用内存,几乎没有浪费什么空间,这种方法也体现了一下指针的强大功能,写这个程序虽然不敢说这个人已经掌握了指针的应用,但是起码可以说他已经会用指针了。代码写出来,看起来已经有点美感。但是也有一些人还是比较喜欢动脑筋的,经过一番思考,终于想出了第三种比较容易写的方法,也许有写初学者可能觉得有些难度,但是事实上这个东西一点都不难,如果稍微有点程序功底之后再看这段代码,应该是相当轻松!#include 《stdio.h》void run(){ char c; c=getchar(); if(c!=’\n’) { run(); } else { return; } putchar(c);}void main(){ run(); printf(“\n“);}写出的代码让人眼前一亮,哇!原来递归功能简单而又好用,那我们为什么不好好利用呢?但是递归也不一定就是最好的选择,因为有时候虽然递归用起来很方便,但是效率却不高,以后的讨论中还会详细说明。
什么是递归调用
递归调用是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间互相调用能产生循环的则一定是递归调用,递归调用一种解决方案,一种是逻辑思想,将一个大工作分为逐渐减小的小工作。
递归函数特点:
1、函数要直接或间接调用自身。
2、要有递归终止条件检查,即递归终止的条件被满足后,则不再调用自身函数。
3、如果不满足递归终止的条件,则调用涉及递归调用的表达式。在调用函数自身时,有关终止条件的参数要发生变化,而且需向递归终止的方向变化。
扩展资料:
递归调用的过程:
递归调用之前的语句是从上到下的,函数调用之后的语句呢是从下到上的,因为后面的语句要等最下层或者最里面最后调用的那个函数执行之后不再调用了开始执行,然后返回上一层的时候再执行上一层函数调用后面的语句。并且特别注意的是,每次函数返回后直接就是函数调用后面的语句。
递归其实就是利用了函数调用的一些特点,很巧妙的不断调用自己,把一个很大的问题分成了很多部分,让每一个函数解决一部分,并且上一层的结果编译器给我们保留了起来,返回的时候还能用。
所以递归调用一定要是每深入一层都会把问题变得越来越小,而且最后能解决,不然就会无限制的调用自己,形成一个无限的循环,最后造成栈的溢出,最后程序崩溃。
参考资料来源:百度百科-递归调用
递归函数的性质
递归函数的定义:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。 性质不能一概而论,视具体问题分别对待。
递归的主要用途和好处是什么精髓在哪儿
这里有:递归 递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现像. 程序调用自身的编程技巧称为递归( recursion)。 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 注意: (1) 递归就是在过程或函数里调用自身; (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 递归算法一般用于解决三类问题: (1)数据的定义是按递归定义的。(Fibonacci函数) (2)问题解法按递归算法实现。(回溯) (3)数据的结构形式是按递归定义的。(树的遍历,图的搜索) 递归的缺点: 递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等
更多文章:

mandated(policy mandated looses是什么意思)
2025年3月29日 13:10

从技术层面看,公有云、私有云、混合云是分别什么意思?微软云计算提供了几种服务模式
2025年3月3日 03:10

htmlspan标签怎么用(html里的 span标签主要用作什么地方)
2025年3月28日 02:10

consecutive是什么意思(consecutive什么意思)
2025年3月22日 04:20

cms建站系统有哪些(需要一个自助建站系统(CMS),哪个最好用)
2025年3月7日 15:00

sounds great(sounds great的英汉互英)
2025年3月1日 08:30

python range(python相对于range应该更倾向于实用xrange吗)
2025年2月23日 03:00

endeavor什么意思(endeavor struggle try attempt的区别)
2025年3月12日 08:00

circle是什么牌子(F英文打头的男款老板裢18K金是什么牌子的)
2025年3月13日 02:10

marginnote3多少钱(marginnote3内购怎么破)
2025年3月4日 19:50