写了几个常见的简单的递归的例子,包括n阶乘、三角形数、二分查找以及汉诺塔问题。很简单,不过确实是用递归的思想解的,那么递归是什么呢?不去百度,就现在用我自己的语言来说就是通过不断的调用自身使得问题的规模越来越小,直到最小规模。这里的最小规模就是递归的"基值情况"。要想用递归解问题,首先需要知道基值情况是什么,比如求N阶乘的基值情况是n=1。不再废话,上代码。
package Recursion;
/**
* 几个简单的递归的例子
* @author wly
*
*/
public class Test {
//构造测试数据
static int[] iArray = new int[1000];
public static void main(String[] args) {
for(int i=0;i<iArray.length;i++) {
iArray[i] = i;
}
System.out.println("N阶乘:" + factorial(10)); //测试n阶乘
System.out.println("三角形数:" + getTriangleNum(100));//测试三角形数
binaryFind(179,0,1000); //测试二分查找
System.out.println("汉诺塔问题:");
hanNuoTower(3, "A", "B", "C"); //测试汉诺塔
}
/**
* 求n的阶乘
* @param i
* @return
*/
public static int factorial(int i) {
if(i == 1) { //确定基值(终止)条件
return 1;
} else {
return (i * factorial(i-1));
}
}
/**
* 求第i个三角数(1,3,6,10,15...)
* @param i
* @return
*/
public static int getTriangleNum(int i) {
if(i == 1) { //确定基值(终止)条件
return 1;
} else {
return getTriangleNum(i-1) + i;
}
}
/**
* 二分法递归查找
* @param i
* @return
*/
public static void binaryFind(int n,int start,int end) {
if(start != end) {
if(n < iArray[(start + end)/2]) {
end = (start + end)/2;
} else if(n == iArray[(start + end)/2]){
System.out.println("二分法查找:" + iArray[(start + end)/2]);
return;
} else {
start = (start + end)/2;
}
binaryFind(n,start,end);
} else {
System.out.println(iArray[start]);
}
}
/**
* 使用递归解汉诺塔问题
* 汉诺塔问题有一个特点,就是不断的重复只有两层高度的移动过程,设有A、B、C三个塔柱
* 其中A是原塔柱,C是目标塔柱,B是临时塔柱。则需要把低下大的圆盘先移动到C,再把上面小的圆盘移动到C上。
* 当塔的高度超过两层时,也是这样的,先将底下所有大的圆盘移动到目标柱上,再将上面小的圆盘移动到目标柱上,
* 这一过程是递归的
*/
public static void hanNuoTower (int n,String original,String temp,String dest) {
//确定基值(终止)条件
if(n == 1) {
System.out.println(original + "->" + dest);
return;
} else {
//STEP 1.将下面(除了最上面一层)的盘子都移动到temp上
hanNuoTower(n-1, original, dest, temp);
//STEP 2.将最上面的盘子移动到dest上
hanNuoTower(1, original, temp, dest);
//STEP 3.将剩余的圆盘都移动到目标柱上
hanNuoTower(n-1, temp, original, dest);
}
}
}
程序运行结果:
N阶乘:3628800
三角形数:5050
二分法查找:179
汉诺塔问题:
A->C
A->B
C->B
A->C
B->A
B->C
A->C
O啦~~~
转载请保留出处:http://blog.youkuaiyun.com/u011638883/article/details/14107667
谢谢!!