一、汉罗塔问题描述:
(1)有3根柱子A,B,C,A柱上有n个盘子,盘子的大小不等,大的盘子在下,小的盘子在上。
(2)要求将A柱上的n个盘子移到C柱上,每次只能移动一个盘子。
(3)在移动过程中,可以借助于任何一根柱子(A、B、C),但必须保证3根柱子上的盘子都是大的盘子在下,小的盘子在上。
二、汉罗塔问题的递归分析思路:
先将前n-1个盘移动到过渡桩去,然后将剩下的一个盘放到目的桩上去,然后再将在过渡桩上的n-1个盘移动到目的桩上。
就得到了每次递归的次数计算公式:(n-1)+1+(n-1)
package ASuanFa;
import java.util.Scanner;
public class HanLuoTa2 {
public static void main(String[] args) {
int num;
Scanner scanner = new Scanner(System.in);
num = scanner.nextInt();
System.out.println(num+"个盘子需要移动"+help(num)+"次");
helper(num,'1','3','2');
try {
System.out.println(num+"的阶乘是"+jieCheng(num));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(num+"的阶乘是"+jieCheng2(num));
System.out.println(num+"的斐波那契数为"+fib(num));
}
/*求汉罗塔问题的总的移动次数*/
private static int help(int n){
if(1==n){
return 1;
}
return help(n-1)+1+help(n-1);
}
/*求汉罗塔问题的具体移动步骤*/
private static void helper(int n,char begin,char end,char through){
if(1==n){
System.out.println(begin+" -> "+end);
}else{
helper(n-1,begin,through,end);
System.out.println(begin+" -> "+end);
helper(n-1,through,end,begin);
}
}
/*阶乘递归方法的代码*/
private static int jieCheng(int n) throws Exception {
if(n<0){
throw new Exception("传入的参数为负数");
}
if(0 == n || 1 == n){
return 1;
}
return jieCheng(n-1)*n;
}
/*阶乘迭代方法的代码*/
private static int jieCheng2(int n){
int res =1;
while(n>1){
res*=n;
n--;
}
return res;
}
/*斐波那契数递归方法的代码*/
private static int fib(int n){
if(1==n || 2==n) {
return 1;
}
return fib(n-1)+fib(n-2);
}
}