递归算法再回顾

ver 1.0

  再次使用递归算法的时候各种问题,再此记录一下递归的一些东西,避免每次遗忘后每次使用都要重新来学习使用。

警醒:

递归算法是处理连续,连续相同的运算步骤的一种程序逻辑的简写,他主要处理的是连续的运算过程,

而连续的过程总有起点和终点,最容易出现问题的地方就是这种数据边界的部分。

 

所以类似递归这种相同逻辑的连续处理算法,有两点问题需要特别注意:

1.一定要确保递归逻辑在数据处理时是符合需求的

2.在数据处理的起始和终止的时候,需要特别注意是否符合实际需求和运算的逻辑,这里特别容易出问题。

 

问题点:

1.递归算法是如何终结的,如何避免堆栈溢出?

2.递归算法在数据处理的时候,递归程序段如何设计,使得满足正确的运行要求?

说明:

递归算法之所以会一直运行,依靠的是执行过程中的自身调用(即在return的时候调用),

如果执行过程中,没有再执行自身的调用,则递归终止。

//求1到100的累加
public
int recursive(int i){ if(i >100){
        //输出这段字符是为了看到这里只是运行了一次 System.
out.println("!!!!!");
        //当这里没有调用递归的算法的时候,递归机终止
return 1; }else{
        //这里进入递归算法
// 这段语句在递归中执行的过程是
//   本次结果+下一次递归结果
//   下一次递归结果+下下一次递归结果
// 下下一次递归结果+下下下一次递归结果
//   i作为传入参数,用于承载上一次运行的结果,调用下一次的时候,i又用于承载下下一次递归结果
//   所以说,这里的i+recursive()语句就是实现了累加这一算法需求
//   但这段代码在边界处理的时候,有问题:因为 i 是作为承载上一次递归预算的结果的变量
//   而第一次调用的时候,没有上一次的递归结果,于是 i 就是在整个递归运算中多加了的值,所以原本100的累加是5050
// 这段代码的结果却是5051
return i+recursive(i+1); } }

自己写过的一些错误代码备忘和反思:

1.在设计if/else语句模块的时候已经给出了return语句,还必须在if/else模块外补充return语句,否则报错

ps:在整理清楚之后,我完全忘记了那种错误的形式,我已经写不出那种错误的代码了,想分析一下也不行了 - -!!!!!!

注:假如再发现了问题,而自己再来看这段自己写下的备忘,千万记下来,深度分析,狠狠地深度分析,以求不再忘记。

posted @ 2016-08-10 13:22  thinfog  阅读(137)  评论(0)    收藏  举报