递归经典算法案例题(汉罗塔、阶乘、斐波那契代码)

 一、汉罗塔问题描述:

(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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值