递归:程序调用自己,通过不断将问题分解,将问题规模逐步减小、分解为简单容易处理的情况。
递归有两个过程:递去与归来。递去的过程不断分解问题规模直到到达临界位置后开始归来,返回到原点。解决问题时,可以在递的过程中解决,也可以在归的过程中解决。
- 案列一 递归求和
/**
*********************
* 递归求和
*
* @param paraValue
* 传入参数.
* @return The sum.
*********************
*/
public static int SumToN(int paraValue){
if(paraValue<=0){
return 0;
} // of if
return SumToN(paraValue-1)+paraValue;
} //of SumToN
输入为5的递去过程图:
- 案列二 斐波那契数列(递归)
/**
*********************
* 斐波拉契数列(递归)
*
* @param paraN
* 传入参数.
* @return The sum.
*********************
*/
public static int fibonacci(int paraN){
if(paraN<=0){
return 0;
}// of if
if(paraN==1){
return 1;
} //of if
return fibonacci(paraN-1)+fibonacci(paraN-2);
} // of fibonacci
红色箭头为递归一,蓝色箭头为递归二,程序先走完递归一才能走递归二。
- 案列三 斐波拉契数列(迭代)
/**
*********************
* 斐波拉契数列(迭代)
*
* @param paraN
* 输入的参数.
* @return The sum.
*********************
*/
public static int fibonacciV2(int paraN){
int first=1,second=1,tempresult=0;
if(paraN<=2){
return first;
} // of if
for(int i=2;i<paraN;++i){
tempresult=first+second;
first=second;
second=tempresult;
} // of for i
return tempresult;
} // of fibonacciV2
主函数:
/**
*********************
* 程序入口.
*
* @param args
* 暂未使用.
*********************
*/
public static void main(String args[]) {
int tempValue = 5;
System.out.println("0 sum to " + tempValue + " = " + SumToN(tempValue));
tempValue = -1;
System.out.println("0 sum to " + tempValue + " = " + SumToN(tempValue));
for(int i = 0; i < 10; i ++) {
System.out.println("Fibonacci " + i + ": " + fibonacci(i));
}//Of for i
}// Of main
}// Of class day08_Recursion
运行效果:
总结:递归这东西虽然代码少,但是很容易绕进去,画图分析要好理解一些。想要正确正确的递归:首先必须明确递归的终止条件(防止无限递归),其次给出处理递归终止时的办法(只有这个地方写好了才能到达预期),要想写好这两个部分还是得多练。