本文主要是介绍J2SE--递归调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前段时间在复习J2SE时候看到了“递归”和“迭代”这部分知识,之前没有很好的梳理,这次补上总结。
一、概念理解:
(1) 递归
“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……””。
这个故事永远也讲不完,因为没有递归结束条件,如果递归没有结束条件,那么就会无限递归下去。
其实递归很简单,形式上一个递归结束条件,一个自己调用自己的方法。
(2)迭代
迭代是重复一组指令,不断第根据变量的旧值推出新值,最终得到所需的解。
二、对比
用一个求等差数列前N项和的例子:1+2+3+4……
对于递归:
sum(5)
5+sum(4)
5+4+sum(3)
5+4+3+sum(2)
5+4+3+2+sum(1)
5+4+3+2+1+sum(0)
5+4+3+2+1+0
5+4+3+2+1
5+4+3+3
5+4+6
5+10
15
可以观察到,递归调用是一个先扩展后收缩的过程,即先进行递推,之后进行回归,类似于我们在软考中所学到的“分治法”,大问题化小问题,小问题解决之后再综合求解大问题。
如图--J2SE视频举例:一定是走到最深处之后,才进行返回。
然而对于迭代方法:
0+1=1
1+2=3
3+3=6
6+4=10
10+5=15
用计算出的结果当做新值继续计算,得到最终结果,这个过程更像是一条直线,把后面的线段拿到前面,不断地前进,没有扩张和收缩的过程。从如上对比中,可以看到“递归”在执行过程中,会有一个扩充再收缩的过程,很容易让人联想到化学课上的“链式反应”,不易受控制,正如概念中所提到的,递归“一个终止条件、一个自身调用”, 一旦终止条件不对,扩张过程加大,容易导致“溢出”错误,而迭代则是直线式进行,在资源上不会出现这种情况。
而之所以会出现溢出,使用递归时每调用一次,就需要在栈上开辟一块空间,而使用迭代时,不会这样,因为仅仅是重复调用某一个过程,所以相比之下,使用迭代更加安全。
然而,在我们使用算法过程中,像之前学习过的回溯法、分治法,都用到了递归调用,在数据结构中,树的遍历,图的搜索,也都是递归,这当然另当别论,一般情况下,能使用迭代,就少用递归。
这篇关于J2SE--递归调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!