递归就很难如何理解递归思想.请问对于递归有没有什么好的如何理解递归思想方法

在学习数据结构与算法的时候,一旦出现递归就很难理解。请问对于递归有没有什么好的理解方法? - 知乎785被浏览56678分享邀请回答3添加评论分享收藏感谢收起递归算法概念是函数调用自己来实现的某种功能,按以下方法理解递归你会恍然大悟(如果你对递归有疑惑的话),并
觉得递归是如此简单:
1.递归是高中数学中的数列那一章讲的内容。数列这章讲了一个概念叫递推公式:如果已知数列的第1项(或前几
项),且从第二项(或某一项)开始的任一An与它的前一项An-1(或前几项)间的关系可以用一个公式来表
示,那么这个公式就叫递推公式,递推公式是给出数列的一种方法。
2.例如斐波那契数列的递推公式就是:An=An-1+An-2(n&2,a1=1,a2=1)
3.那么现在如果想用递归的方式表示斐波那契数列即可定义函数f(n):当n&2时f(n)=f(n-1)+f(n-2);当n=1时f(n)=1,当n=2时f(n)=1;
即private static int fibonacciRe(int i) {
if(i == 1 || i == 2)
else if(i&2)
return fibonacciRe(i-1)+fibonacciRe(i-2);
4.解释:其实说白了递归函数就是一个递推公式,只要递推公式往纸上一写,把项A替换成函数名字,把n替换成函的
参数即可,最后用if处理一下特殊参数值时的结果值就欧了。
5.总结:我们为什么有些人很难理解递归函数呢,我个人觉得是我们在学计算机语言的时候都是在大学里学的,然后
此时的高中数学知识已经忘却了,取而代之的是我们把我们的大脑陷在了递归方法调用的过程中了,比如,要一
步步该怎么调用了。如果我们要结合高中数学中的这个概念的话就一点也不难理解递归,反倒觉得递归的算法一
眼看去就很明白,我个人以前难于理解递归是因为只要我看到了递归我的脑子就在循环的一层层的往下继续调
用,觉得很难理解,其实我们完全不要去想那一层层的调用关系,反而想到递归就把他抽象出来一个递推公式,
这样你就会恍然大悟的感觉,原来递归如此简单。我们以前不好理解递归是我们自己的给自己制造了理解它的障
碍。觉得理解这个就跟用眼在电脑上看懂三维立体画有异曲同工之妙。现在如果只要给你在纸上写出了一个
递推公式,你立马就可以用递归函数写出来。呵呵。。递归是不是很简单呢?!其实我们的计算机算法都来源于
数学,计算机算法是数学应用于生产的很好的一个例子!
6.附:斐波那契数列的非递归算法,由于递归很耗资源,所以不到迫不得已尽量不要用递归算法
public static int z(int n){
for(int i=3;i&=n;i++){
c=a+b;
7.以上都是个人一己之见,有错误或者不当的,欢迎吐槽!
本文已收录于以下专栏:
相关文章推荐
递归真的非常非常重要!!!
我们直接从例子开始吧!
一:简单实例
1.阶乘的实现
写个函数实现   N! = N × (N-1) × (N-2) × ... × 2 × 1
在说递归之前,我给大家说一个小故事,故事就是在说递归之前,我给大家说一个小故事,故事就是在说递归之前,我给大家说一个小故事,故事就是在说递归之前,我给大家说一个小故事,故事就是在说递归之前我给大家说一...
大家都知道,递归的本质和栈数据的存取很相似了,都是先进去,但是往往最后处理!再者对于递归函数的局部变量的存储是按照栈的方式去存的,对于每一层的递归函数在栈中都保存了本层函数的局部变量,一边该层递归函数...
递归真的非常非常重要!!!
我们直接从例子开始吧!
一:简单实例
1.阶乘的实现
写个函数实现   N! = N × (N-1) × (N-2) × ... × 2 × 1
递归真是个奇妙的思维方式。对一些简单的递归问题,我总是惊叹于递归描述问题和编写代码的简洁。但是总感觉没能融会贯通地理解递归,有时尝试用大脑去深入“递归”,层次较深时便常产生进不去,出不来的感觉。这种状...
今天又写了个C++中关于字符串倒序输出的,要求用递归算法求解!
       关于递归,以前也思考了很久自以为已经理解好了,但是今天做题还是磕磕碰碰,不能够快速的反应过来,所以觉着有必要好好总结下,...
本文转载自:http://blog.csdn.net/zhangxiangdavaid/article/details/
二叉树的三种遍历,递归写法只要理解思想,几行代码。可是非...
在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写...
转载地址:http://blog.csdn.net/zhangxiangdavaid/article/details/
在前两篇文章二叉树和二叉搜索树中已经涉及到...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
* Created by LR on .
function permutate(str) {
var result = [];
if(str.length == 1){
return [str]
var preResult = permutate(str.slice(1))
for (var j = 0; j & preResult. j++) {
console.log(preResult[j])
for (var k = 0; k & preResult[j].length+1; k++) {
var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k);
result.push(temp);
console.log("!")
console.log(result)
return result
permutate('abc');
第一次是abc 进入函数,然后长度大于1进入else;所以这里就应该是 var preResult = permutate("bc")之后呢??我就想到bc进入函数,长度大于一之后就 var preResult = permutate("c")长度等于1了 然后就返回一个c 这个for循环是怎么执行的?? 谁能告诉我一下。。。这个是全排列的算法
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
想要理解递归,首先你要理解递归。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
建议楼主先从最简单的两位字符递归开始分析,比如 permutate('ab');它发生了什么呢,如下:
1.进入permutate函数内部,此时result为[],由于'ab'的长度不是1,所以走到了else分支2.取得的值 preResult = 'b'(这里递归了一次,取了后面的一位字符)3.进入for循环,此时只将‘b’进行循环4.进入关键的k(for)循环,循环了2次(注意,前面是一个字符串进入循环,所以k循环的次数是str.length+1)5.k循环中
k为0,生成一个tmp值'ab'('b'.slice(0,0)为空,str[0]为'a',‘b’.slice(0)为b) 并且将那个'ab'push进result中
k为1,生成一个tmp值‘ba’('b'.slice(0,1)为'b',str[0]为'a',‘b’.slice(1)为空) 并且将那个'ba'push进result中
return result,所以这时最终的结果为['ab','ba']
同理,当三位字符递归时, permutate('abc');
1.进入permutate函数内部,此时result为[],由于'abc'的长度不是1,所以走到了else分支2.取得的值 preResult = ['bc','cb'] (就是上面一步中两位字符递归后的结果,只不过是将ab换为了bc)3,进入for循环,此时for循环2次(分别为'bc'和'cb')
‘bc’循环时,进入关键的k循环,k循环的次数为3
k=0,tmp值为‘abc’
k=1,tmp值为'bac'
k=2,tmp值为'bca'
循环结束后,result为['abc','bac','bca']
‘cb’循环时,进入关键的k循环,k循环的次数同样为3
k=0,tmp值为‘acb’
k=1,tmp值为'cab'
k=2,tmp值为'cba'
循环结束后,result为['abc','bac','bca','acb','cab','cba']
4.返回最终的result,运行程序,发现结果完全匹配。分析结束。
接下来如果四位字符递归同理,路得一步一步走,莫急!
PS; ~码字不容易啊~
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:中国领先的IT技术网站
51CTO旗下网站
《算法之道(第2版)》本书甄选了那些最能展现算法思想、战略和精华,并能够有效训练算法思维的内容。本书将算法的讨论分为五篇:算法基础篇、算法设计篇、算法分析篇、经典算法篇、难解与无解篇。本节为大家介绍递归树法。
作者:邹恒明来源:机械工业出版社| 09:46
3.3.1& 递归树法
对于很多人来说,理解抽象的东西不如理解具体的东西更容易,而一个递归表达式就是一个抽象的东西,不容易看出其中所隐含的执行序列和规律,如每层递归的成本。但如果我们将该抽象表达式用图形的方式加以展开,则抽象变具体,就容易理解了。虽然不是所有抽象的东西都可以用具体的形象来描述,但抽象递归表达式恰恰可以被具体化。
而将抽象递归表达式具体化的最佳图形表示就是递归树。该方法我们在解乘法运算的递归表达式时已经使用过。这种递归树给出的是一个算法递归执行的成本模型。该模型以输入规模为n开始,一层层地分解,直到输入规模变为1为止。而这个时候的解决方案已经是琐细的了。图3-5为表达式T(n) = T(n /4) + T(n / 2)+ n2 的递归树。&
图3-5& T(n) = T(n/4) + T(n/ 2)+ n2的递归树
很显然,递归树解法的优点是直观,很多情况下我们可以直接看出来答案。但缺点是不一定可靠,就像任何使用省略号的方法一样。(省略号到底是省略了什么?)例如,图3-3里面的省略号总让我们觉得这个结果不怎么令人放心:虽然第1层、第2层的成本没有任何问题,但我们怎么能断定没有画出的第3层的成本是(5/16)2n2呢?当然,为了保险,我们可以画出第3层并验证结果就是(5/16)2n2,但第4层的结果又如何肯定呢?
很显然,将每一层都画出来并不现实,因此,省略号就成为画递归树时不可缺少的工具。而这个省略号就成为很多人心头解不开的疙瘩。
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:414306人学习过
讲师:92033人学习过
讲师:153613人学习过
精选博文论坛热帖下载排行
本书是讲解C++语言程序设计的优秀教程。全书围绕C++语言来组织,开始章节介绍编程的普通感念,接下来详细介绍C++中的继承、多态、异常处理...
订阅51CTO邮刊在学习数据结构与算法的时候,一旦出现递归就很难理解。请问对于递归有没有什么好的理解方法? - 知乎785被浏览56678分享邀请回答72 条评论分享收藏感谢收起

我要回帖

更多关于 人 很难理解递归 的文章

 

随机推荐