汉诺塔问题(递归)
我相信有很多年纪稍微大的人,都应该玩过 汉诺塔 这个益智小游戏.
不太了解的朋友们,可以先去了解一下。其次可以去4399小游戏上面体验一下。
我这里准备用java代码实现
public class TestHaonl { public static void main(String[] args) { hanoi(5,'A','B','C'); } /** * @param n 共有n个盘子 * @param from 开始的柱子 * @param in 中间的柱子 * @param to 目标柱子 * 无论有多少个盘子,都认为只有两个 */ public static void hanoi(int n,char from ,char in,char to) { if (n==1) { System.out.println("第1个盘子从"+from+"移到"+to); }else { //移动上面所以盘子到中间位置 hanoi(n-1, from,to,in); //移动下面的盘子 System.out.println("第"+n+"个盘子从"+from+"移动到"+to); //把上面的所有盘子移动目标位置 hanoi(n-1,in,from, to); } }
下面总结一下递归的要求
1 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归继续执行。
2 递归函数中,位于递归调用前的语句和被调函数具有相同的顺序。如打印语句 #1 位于递归调用语句前,它按照递归调用的顺序被执行了 4 次。
3 每一级的函数调用都有自己的私有变量。
4 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反。
5 虽然每一级递归有自己的变量,但是函数代码并不会得到复制。
6 递归函数中必须包含可以终止递归调用的语句。