搜故事,从300万个故事到海量知识百科的华丽转变!
搜故事 > 小故事 > 正文

你为什么学不会递归?读完这篇文章轻松理解递归算法

时间:2018-04-23

很多人也是半懂不懂,结果学到很深的境地也会因为自己基础不好,导致发展太慢

提示:本文共有 1439 个字,阅读大概需要 3 分钟。

对于很多编程初学者来说,递归算法是学习语言的最大障碍之一。很多人也是半懂不懂,结果学到很深的境地也会因为自己基础不好,导致发展太慢。

可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不知道怎么使用。今天,我们就来说一说递归算法的使用。

什么是递归

递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。

通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。

递归的基本原理

第一:每一级的函数调用都有自己的变量。

第二:每一次函数调用都会有一次返回。

第三:递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序。

第四:递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反。

第五:虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。

递归的优缺点

递归的三大要素

第一要素:明确你这个函数想要干什么。先不管函数里面的代码什么,而是要先明白,你这个函数的功能是什么,要完成什么样的一件事。

第二要素:寻找递归结束条件。我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。

第三要素:找出函数的等价关系式。我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。

递归的过程

具体地说,如果递归函数调用自己,则被调用的函数也将调用自己,这将无限循环下去,除非代码中包含终止调用链的内容。通常的方法将递归调用放在if语句中。例如,void类型的递归函数recurs()的代码如下:

用文字再现这段代码块的内容:

只要if语句为true,每个recurs()调用都将执行statement1,然后再调用recurs(),而不会执行statements2 。当前调用结束后,程序控制权将返回给调用它的recurs(),而该recurs()将执行其statements2部分,然后结束,并将控制权返回给前一个调用,依次类推。

递归的使用

递归的强大之处在于它允许用户用有限的语句描述无限的对象。因此,在计算机科学中,递归可以被用来描述无限步的运算,尽管描述运算的程序是有限的。 这一点是循环不太容易做到的。

编写正确的递归算法,一定要有 ”归“ 的步骤,也就是说递归算法,在分解问题到不能再分解的步骤时,要让递归有退出的条件,否则就会陷入死循环,最终导致内存不足引发栈溢出异常。

下面,我们通过两个例子来学习一下,递归的使用:

例一:递归求阶乘

例二:递归求斐波那契数列

从上面的步骤我们可以清晰的看到递归算法的第一步是分治,把复杂的大的问题,给拆分成一个一个小问题,直到不能再拆解,通过退出条件retrun,然后再从最小的问题开始解决,只到所有的子问题解决完毕,那么最终的大问题就迎刃而解。

递归的优化方法

递归问题中想到思路本身不非常难,真正的难点在于如何优化。

1、考虑是否重复计算

如果你使用递归的时候不进行优化,是有非常非常非常多的子问题被重复计算的。因此,使用递归的时候,必要须要考虑有没有重复计算,如果重复计算了,一定要把计算过的状态保存起来。

2、考虑尾递归

对于递归的问题,我们一般都是从上往下递归的,直到递归到最底,再一层一层着把值返回。

不过,有时候当 n 比较大的时候,例如当 n = 10000 时,那么必须要往下递归10000层直到 n <=1 才将结果慢慢返回,如果n太大的话,可能栈空间会不够用。这个时候,就可以用尾递归优化来解决。

顾名思义,尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量。直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去。

有的人刚接触算法的时候,一直都惧怕递归,也很少或者说几乎就不写递归的代码。但其实学习了以后,发现递归还是挺可爱的。就像在数学找一组数字的规律一样,可以锻炼我们的思维。希望这篇文章,能额昂你有所收获。

看到此处说明本文对你还是有帮助的,关于“你为什么学不会递归?读完这篇文章轻松理解递归算法”留言是大家的经验之谈相信也会对你有益,推荐继续阅读下面的相关内容,与本文相关度极高!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
PHP算法:斐波那契数列的N种算法

PHP算法:斐波那契数列的N种算法

斐波那契数,重复计算,自底向上,递归计算,兔子,定义,性能,方法,记忆,问题,存储,斐波那契数列,递归方法,列昂纳多,列以,好的,前言,前段时间,交流学习,例子,低位,常规,因数,学家,学上,次数,解法,递推,影响,循环

2013-06-21 #经典故事

如何让孩子的英语学习更轻松?看看这篇文章吧!

如何让孩子的英语学习更轻松?看看这篇文章吧!

孩子,英语,家长,语法,孩子们,书籍,淘宝,应试,英语学习,培训班,东西,兴趣,单词,妈妈,家庭教育,木偶,方法,时候,现状,知识,背单词,英语教学,语言,在教,学英语,我的童年,教育孩子,让孩子,这篇文章,子童

2018-07-04 #故事大全

学习贴:读过这篇文章 你能轻松掌握橡塑保温材料的基本知识

学习贴:读过这篇文章 你能轻松掌握橡塑保温材料的基本知识

橡塑保温材料,橡塑,温度,管道,橡胶,尺寸,生产,优点,原材料,容器,介质,材料,绝热材料,应用,施工,王工,东西,丁腈橡胶,专业,保温材料,保温管,厚度,发泡,板状,弹性,工具,护套,把套,板材,水管

2014-03-12 #长篇故事

看不懂漂相的钓友有福了 这篇文章让你轻松‘读’懂漂相

看不懂漂相的钓友有福了 这篇文章让你轻松‘读’懂漂相

钓友,浮漂,动作,这个时候,内容,饵料,什么时候,相大,大家好,个人观点,地方,新手,私信,杂鱼,现象,特点,结果,窝内,刚开始,你不懂,不适合,下上浮,不要犹豫,之后在,但不是,因为你,有几位,我怎么,往下看,完全可以

2017-11-10 #小故事

作文标题三步法:教你轻松拟出好标题!

作文标题三步法:教你轻松拟出好标题!

标题,悬念,读者,时候,文章,作者,姨妈,兴趣,开头,化用,方法,写作文,作文,事情,修辞,全文,小孩,情节,成语,手下,方式,爸爸,老师,警察,高烧,听起来,让人觉得,这篇文章,好的,好想

2013-02-16 #小故事

原来鲁迅的文章要这样读更带劲!轻松记忆内容情节 语感也提升了

原来鲁迅的文章要这样读更带劲!轻松记忆内容情节 语感也提升了

山海经,这一段,鲁迅的文章,文章,作者,称呼,鲁迅,我立刻,一角,保姆,人物,老师,时候,课文,我自己,给大家,这篇文章,陆玑,书多,同学会,读一,效率,同学们,五年制,个人,一字一句,三脚,专有名词,书名,习惯

2009-04-12 #故事会

为什么都说学幼师工作的都很累?看到小姐姐日常练习后 真相了!

为什么都说学幼师工作的都很累?看到小姐姐日常练习后 真相了!

工作,幼师,每天都,下腰,小朋友,职业,老师,不轻松,刚开始,不在话下,小朋,练琴,上练,导语,一段时间,女生,图片,实际,学会,小丽,幼儿,真相,时候,拉伤,手艺,每天晚上,时刻,理想,洗衣服,父母

2017-02-07 #经典故事

遵循四项饮食规则 轻松减肥无反弹

遵循四项饮食规则 轻松减肥无反弹

饮食,规则,蔬菜,脂肪,效果,摄入量,减肥反弹,主食,作用,热量,身体,食物,饮食习惯,这篇文章,四小时,控制饮食,很重要,限制饮食,可增,妙招,都会,条规,增重,会分,内容,南瓜,土豆,学会,建议,情况

2024-01-31 #综合