" 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。"
----背景如上, 所以当有n个圆盘时,显然,f(1)=1,f(2)=3,f(3)=7.........f(n)=2^n-1。显然,是需要递归的方法来解决这个问题。
以下是个人写的java的实现版本:
package common; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Hanoitower { /** * @param args 2013.8.1 */ public void move(int n, char a, char b, char c) { if(n == 1) System.out.println("盘 " + n + " 由 " + a + " 移至 " + c); else { move(n - 1, a, c, b); System.out.println("盘 " + n + " 由 " + a + " 移至 " + c); move(n - 1, b, a, c); } } public static void main(String[] args) throws NumberFormatException, IOException { // TODO Auto-generated method stub int n; BufferedReader buf; buf = new BufferedReader(new InputStreamReader(System.in)); System.out.print("请输入盘数:"); n = Integer.parseInt(buf.readLine()); System.out.println("需要移动的次数为:"+(Math.pow(2, n)-1)); //由n已经确定了移动次数 ,math.pow表示一个数的多少次方,返回类型为double。 Hanoitower hanoi = new Hanoitower(); hanoi.move(n, 'A', 'B', 'C'); } }
关于递归,程序由方法组成,而方法有一层次的形式调用其他的方法,但有些时候,这些方法需要调用自身从而方便的求解一些特殊的问题。递归方法就是子调用方法,在方法内直接或者间接的调用自己,即方法的嵌套是方法的本身。 递归又分为两中,直接递归和简介递归,简单通过代码描述一下直接递归:求菲波那切数列的前n项和:
---菲波那切数列的第一、二项是1,后面的每一项是前两项的和:1、1、2、3、5、8、13、21......
package common; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Digui { /** * @param args 2013.8.1 * @throws IOException * @throws NumberFormatException */ //定义fun函数,直接递归 public static int fun(int x) { // TODO Auto-generated method stub if(x>2) return(fun(x-1)+fun(x-2)); else return 1; } public static void main(String[] args) throws NumberFormatException, IOException { // TODO Auto-generated method stub int x1=1; int sum=0; int n=0; String str = null; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入菲波那切数列的项数 : "); str=br.readLine(); //正则表达式判断输入的是否是一个数字 Pattern pattern=Pattern.compile("[0-9]*"); //构造一个模式 Matcher isNum=pattern.matcher(str); //创建一个匹配器 if(isNum.matches()){ //如果输入的是一个数字 n=Integer.parseInt(str); if(n>0){ for(int m=1;m<n;m++) { x1=fun(m); sum=sum+x1; } System.out.println("所求菲波那切数列的第n项为:" +sum); } else{ System.out.println("请输入一个大于零的正整数!"); } } else{ System.out.println("请输入一个数字!"); } } }