java递归算法经典实例 递归与循环有什么区别?
递归在函数体中调用自己。如果不受控制,它将继续调用自身,直到堆栈溢出。循环是区域内一段代码的重复执行,如果不加以控制,就会形成死循环。所以无论是递归还是循环,都必须设置一定的条件来结束递归或循环。在实际问题中,有一些问题是递归的。用递归程序来解决这样的问题会感觉更自然,程序也会更简单。然而,递归经常调用函数,并且开销(内存、时间)很大。有些问题不适合使用。循环不需要自己调用,甚至不能调用函数,效率很高。然而,递归应该转变为非递归,正如我们所知,如果您想在编程中重复执行业务,通常有两种方法来实现它:递归和循环。在实际的编码过程中,我们不建议使用递归,而是建议使用循环。为什么?
事实上,不仅仅是Java,任何编程语言,如果递归写入错误,都可能导致内存溢出
!学习过Java的朋友一定或多或少听说过并理解了堆栈内存和堆内存。程序运行时,计算机操作系统会给每个进程分配堆内存和堆栈内存,分配的堆栈内存有一个上限。一旦超过上限,就会导致内存溢出。
为什么递归操作容易导致内存溢出?主要原因如下:
在递归方法中,如果终止递归的条件写得不正确,可能导致无限递归,最终导致内存溢出;
即使递归方法和退出递归条件正常,如果递归深度太深(递归次数太多),也会导致堆栈内存溢出!因为栈入栈出的规则是先入后出(先入后出),如果递归次数过多,就会导致只入不出栈,最后导致栈内存溢出。
将递归写入方式改为循环写入方式的优点是不会在短时间内出现只进不出栈的现象,避免了栈内存溢出的现象。
递归与循环有什么区别?
循环和递归的本质区别在于内存的使用。递归是方法本身。随着递归次数的增加,内存消耗也在不断增加。当我们编写代码时,内存是一个非常重要的部分。我们尽量减少内存的消耗,以免浪费系统资源。循环占用的内存非常小,每次写代码时,内存非常重要,第二个循环会释放之前分配的内存,但是很多递归函数不能用循环来实现,所以我们要考虑要实现的函数。如果函数不能通过非递归来完成,我们就不会刻意更改它们。
java递归改为循环后为什么不会导致栈内存溢出?
递归和迭代都是循环类型。简单地说,递归就是反复调用函数本身来实现循环。迭代是由函数中的某些代码实现的循环。迭代与普通循环的区别在于,循环代码中参与运算的变量也是保存结果的变量,当前保存的结果是下一次循环计算的初始值。在递归循环中,当满足终止条件时,循环将逐层返回。迭代使用计数器结束循环。当然,在许多情况下,各种循环是混合的,这取决于具体的需要。递归示例,例如,给定一个整数数组,使用半查询返回数组中指定值的索引,假设数组已排序。为了便于描述,假设所有的元素都是正数,数组的长度是2的整数倍。半查询是一种查询,它比遍历所有元素快得多。Int find(Int*ari,Int index,Int len,Int value){if(len==1)//最后一个元素{if(ari[index]==value)return index//查询返回索引return-1//查询失败,返回-1}//如果长度大于1,执行半递归查询int half=len/2//检查检查值是否大于上半部分的最后一个值。如果是,则递归查询第二部分If(value>ary[index half-1])return find(ary,index half,half,value)//否则递归查询上部分return find(ary,index,half,value)}迭代。经典的例子是实数的累加,例如计算从1到100的所有实数之和。int v=1对于(i=2i<=100i){v=vi}
java递归算法经典实例 java保存递归结果 递归与循环的优缺点
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。