递归算法再回顾
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:在整理清楚之后,我完全忘记了那种错误的形式,我已经写不出那种错误的代码了,想分析一下也不行了 - -!!!!!!
注:假如再发现了问题,而自己再来看这段自己写下的备忘,千万记下来,深度分析,狠狠地深度分析,以求不再忘记。

浙公网安备 33010602011771号