问题描述:
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
程序实现:
/**
* 汉诺塔
*
* @author song
*/
public class Hanuota {
/**
* 汉诺塔问题
*
* @param n 要移动的盘子总数
* @param A 柱子1 初始盘子所在柱子
* @param B 柱子2 为了完成移动任务的辅助柱子
* @param C 柱子3 要移动到的目标柱子
*/
private static void hanoi(int n, char A, char B, char C) {
if (n == 1) {
move(A, 1, C);
} else {
hanoi(n - 1, A, C, B);
move(A, n, C);
hanoi(n - 1, B, A, C);
}
}
/**
* 移动盘子方法
*
* @param z1 柱子1
* @param n 编号为n的盘子
* @param z2 柱子2
*/
private static void move(char z1, int n, char z2) {
System.out.println("从" + z1 + "移动编号为" + n + "的盘子到" + z2);
}
public static void main(String... args) {
hanoi(3, 'A', 'B', 'C');
}
}
以上程序采用递归解决。 另一个经典问题也可用递归解决:斐波那契数列求和
斐波那契数指的是这样一个数列:1、1、2、3、5、8、13、21 ..., 从第三个数开始,每个数都是前两个数之和.
/**
* Fibonacci数列
*
* @author song
*/
public class Fibonacci {
/**
* Fibonacci数列
*
* @param n 求斐波那契数列第n个值
* @return 第n个值
*/
public static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}
public static void main(String... args) {
int sum = 0;
for (int index = 1; index <= 10; index++) {
int val = fib(index);
System.out.println(val);
sum += val;
}
System.out.println("和:" + sum);
}
}