大家好,关于java递归改为循环后为什么不会导致栈内存溢出很多朋友都还不太明白,今天小编就来为大家分享关于java为什么不建议使用递归的知识,希望对各位有所帮助!
本文目录
尾递归究竟是好是坏
无论什么递归,在实际工作都不建议使用。但是递归这种思想,在数据结构与算法相关的课程中还是很重要的,尤其是可以优化这个思想,解决一些迭代问题。
普通递归大多数人了解普通递归,都是在计算机相关专业经典本科书籍谭浩强的《C语言程序设计》中,但是求n!阶乘其实用递归是不明智的,因为除了速度慢,使用递归还无法预测计算过程中内存的使用情况,如果发生了OOM就会影响整个项目。
递归的百度百科解释是程序调用自身的编程技巧,也就是说在程序中调用了自己,如下图,可以看到在shi_er这个函数中,又调用shi_er自身,从而达到了十进制转换二进制的目的。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,构成递归需具备的条件:
1.子问题须与原始问题为同样的事,且更为简单;
2.不能无限制地调用本身,须有个出口,化简为非递归状况处理。
但是,如果没有满足上述条件,又轻易调用递归,就会有无限死循环的风险,这也是我么在实际工作中不推荐使用递归的的原因。
尾递归从上面的代码我们可以看到,普通递归是从初始状态开始计算,而尾递归是从最后开始计算,函数调用是出现在函数的尾部,直接让被调用的函数返回时越过调用者,返回到调用者的调用者去。尾递归是极其重要的,因为用尾递归的话,可以避免对函数对堆栈和内存的无法估计的消耗,无须保存中间函数的堆栈。
再举一个用尾递归实现斐波那契数列的例子
intFibonacciTailRecursive(intn,intret1,intret2)
{
if(n==0)
returnret1;
returnFibonacciTailRecursive(n-1,ret2,ret1+ret2);
}
综上,尾递归能够比普通递归更加安全,但是总的来说,基于我的经验,实际工作中并不推荐使用递归。如果能够对你有所帮助,欢迎点赞留言。
我是苏苏思量,来自BAT的Java开发工程师,每日分享科技类见闻,欢迎关注我,与我共同进步。
信息间的递归定义
信息间的递归是指程序调用自身的编程技巧。它分为调用阶段和回退阶段,递归的回退顺序是它调用顺序的逆序。
信息间的递归使用的是选择结构:if/switch。而for,while,dowhile使用的是循环结构。
信息间的递归优点:使程序结构更清晰,更简洁,更容易让人理解;
信息间的递归缺点:使用递归调用时,如果过多的调用容易造成java.lang.StackOverflowError即栈溢出和程序执行过慢。
这是一个潜在Bug和影响程序执行效率问题,需要谨慎使用。
对于互联网这种以速度和效率来维护用户量,不得以用递归时,可以把处理的数据放入缓存,或者直接使用迭代等方式来解决。
java递归改为循环后为什么不会导致栈内存溢出
我们知道,在编程中如果想让某个业务重复执行,一般有两种实现方式,分别是:递归和循环。在实际编码过程中,我们并不建议使用递归,反而是建议使用循环,这是为什么呢?
递归不当会导致内存溢出其实不单单是Java,任何一款编程语言,如果递归写法不对,那就可能导致内存溢出!
学过Java的朋友肯定或多或少都听说和了解过栈内存和堆内存,程序在运行时,电脑操作系统会给每个进程都分配有堆内存、栈内存,所分配的堆栈内存都是有上限的,一旦超过了这个上限就会导致内存溢出现象。
为什么递归操作容易导致内存溢出呢?原因主要有以下几点:
递归方法体内,如果终止递归的条件写错了,那可能会导致无限递归,最终导致内存溢出;
即使递归方法及退出递归条件都是正常的,但若递归深度过深(递归次数过多),也会导致栈内存溢出!因为栈的出入规则是先入后出(先入栈的最后再出来),如果递归次数过多就会导致只入栈不出栈,最终栈内存溢出。
递归改循环可以降低内存溢出的可能注意,递归写法改成循环写法可以降低内存溢出的风险,但这不是绝对的,如果循环写成了死循环一样会导致内存溢出。
递归写法改成循环写法的好处是,不会在短时间内出现栈的只入不出现象,所以可以规避栈内存溢出现象。
学java是看书好还是看视频好
作为靠Java技术吃饭的软件工程师来谈谈我对这个问题的想法。
学Java看书还是看视频最有效呢?看书和看视频如果要选择一样,那肯定是书来的更细致一点,大部分Java视频说的都太浅或者太片面,只挑比较常见的知识点讲,但是很多时候,那些不起眼的知识点一样实用。
实际上完全可以两个都选择,如果是Java零基础初学者建议先看书的前几章,然后再去听听视频。这个道理就相当于你上学的时候,在听老师上课之前如果做过看书预习,那效果简直不要更好,这样会带着问题去听视频教授,而且从文字到图像双重加深学习者印象。
如果选择看Java书籍,初学者建议阅读《firstheadJava》,这部书对Java初学者非常友好,图文并茂。
如果看视频去学习,建议看看网络上很容易搜到的课程,或者某宝上直接购买课程,大部分都会讲基础,而且也确实讲的挺好。
值得一提的是,学Java无论是看书还是看视频,实战最重要。
你看完书籍或者视频,一定要去用电脑去实战敲代码,不然学了也掌握不了,这是作为程序员亲身体验。还有一个很好的学习Java的方法我经常推荐给朋友,叫“费曼学习法”,爱学习的朋友可以了解一下这里不多说,可以说个人认为这是最有效的学习方法。
关注“极客宇文氏”,一名热心有料的软件工程师OK,关于java递归改为循环后为什么不会导致栈内存溢出和java为什么不建议使用递归的内容到此结束了,希望对大家有所帮助。
声明:本文内容来自互联网不代表本站观点,转载请注明出处:https://bk.oku6.com/12/101161.html