1. 递归
递归,某个函数直接或者间接地调用自身的过程,通俗的来讲就是套娃,对于套娃来说最小的那个娃娃就是结束,同样在递归中也需要这一个"最小的娃娃",即递归出口;套娃的每个娃娃的形状都一样,而且每一层包裹着该层的里面一层,而对于递归来说的"相同的形状"就是递归通式,而"包裹"也是在递归代码中递归通式是进入下一层的入口,递归出口和递归通式是递归非常重要的两要素。
2. 累加函数与斐波那契(fibonacci)数列
2.1 累加函数
递归出口:传入参数值小于等于0时返回0
递归通式: sum(paraN) = sumToN(paraN -1) + paraN
public static int sumToN(int paraN) {
if (paraN <= 0) {
// Basis.
return 0;
} // Of if
return sumToN(paraN - 1) + paraN;
}// Of sumToN
2.2 斐波那契(fibonacci)数列
斐波那契数列,又称黄金分割数列,是一个第一项和第二项为1,后面每项为前两项的和的数列,即f(n) = f(n-1) + f(n-2) (n>=2)。
递归出口:传入参数为1返回1,传入参数为0时返回0
递归通式:fibonacci(paraN) = fibonacci(paraN-1) + fibonacci(paraN-2)
public static int fibonacci(int paraN) {
if (paraN == 0) {
// Negative values are invalid. Index 0 corresponds to the first element 0.
return 0;
}
if (paraN == 1) {
// Basis.
return 1;
} // Of if
return fibonacci(paraN - 1) + fibonacci(paraN - 2);
}// Of fibonacci
3. 递归测试
package datastructure;
/**
* Recursion. A method can (directly or indirectly) invoke itself. The system
* automatically creates a stack for it.
*
* @author Yunhua Hu yunhuahu0528@163.com.
*/
public class Recursion {
/**
*********************
* Sum to N. No loop, however a stack is used.
*
* @param paraN
* The given value.
* @return The sum.
*********************
*/
public static int sumToN(int paraN) {
if (paraN <= 0) {
// Basis.
return 0;
} // Of if
return sumToN(paraN - 1) + paraN;
}// Of sumToN
/**
*********************
* Fibonacci sequence.
*
* @param paraN
* The given value.
* @return The sum.
*********************
*/
public static int fibonacci(int paraN) {
if (paraN == 0) {
// Negative values are invalid. Index 0 corresponds to the first element 0.
return 0;
}
if (paraN == 1) {
// Basis.
return 1;
} // Of if
return fibonacci(paraN - 1) + fibonacci(paraN - 2);
}// Of fibonacci
/**
*********************
* The entrance the program.
*
* @param args
* Not used now.
*********************
*/
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 Recursion
输出: