0
点赞
收藏
分享

微信扫一扫

汉诺塔(递归实现)

心如止水_c736 2022-04-20 阅读 87
算法

1.递归方式

主要代码:

    public static int f(int n,char a,char b,char c){

//汉诺塔

        if(n==1){
            System.out.println(a+"-->"+c);
            number++;
            return 0;
        }
        else{
            f(n-1,a,c,b);
            System.out.println(a+"-->"+c);
            f(n-1,b,a,c);
            number++;
        }

        return 0;
    }

测试:

public class Text {
    //汉诺塔
   static int number=0;

    public static void main(String[] args) {


       long time1= System.currentTimeMillis();
        char a='A',b='B',c='C';
     System.out.println(f(17,a,b,c));




        System.out.println("number: "+number);
     long time2=  System.currentTimeMillis();
        System.out.println(time2-time1);

    }

    public static int f(int n,char a,char b,char c){

//汉诺塔

        if(n==1){
            System.out.println(a+"-->"+c);
            number++;
            return 0;
        }
        else{
            f(n-1,a,c,b);
            System.out.println(a+"-->"+c);
            f(n-1,b,a,c);
            number++;
        }

        return 0;
    }

 

当n==17时;

算法耗费时间为685ms

但该函数创建了131071次(2^17-1);

第二种方式(用字符串拼接的方式改进)

用的算法还是递归,可以把汉诺塔的移动盘子的步骤记录下来到字符串中,然后如果字符串中已记录中的,则直接跳过(相当于去掉递归中重复的部分)

import static jdk.nashorn.internal.objects.NativeString.substr;

public class name {
    static String str="";
    static int [] count=new int[100];
    static int number=0;
    public static void main(String[] args) {

        long time1= System.currentTimeMillis();

        char a='A',b='B',c='C';
        System.out.println(f(17,a,b,c));
        readMethod();
        System.out.println("number: "+number);

        long time2=  System.currentTimeMillis();
        System.out.println(time2-time1);

    }

    public static int f(int n,char a,char b,char c){

//汉诺塔

        if(n==1&&count[1]==0){
            // System.out.println(a+"-->"+c);
            writeMethod2(a,c);
            count[1]=1;
            number++;
            return 0;
        }
        else{
            if(count[n]==0)   {
                count[n]=1;
                f(n-1,a,c,b);

                //   System.out.println(a+"-->"+c);
                writeMethod2(a,c);
                readMethod1(a,b,c);
                f(n-1,b,a,c);
                number++;
            }
        }

        return 0;
    }


    public static void writeMethod1(String str1)

    {

         str=str.concat(str1);

    }

    public static void writeMethod2(char A,char B)

    {
        str=str.concat(A+"-->"+B);


    }


    public static void readMethod1(char A,char B,char C)

    {
String str1="";

            str1=substr(str,0, str.length()-5);
            str1 = str1.replace(C,'M');
            str1 = str1.replace(A,C);
            str1 = str1.replace('M',A);
            str1 = str1.replace(B,'M');
            str1 = str1.replace(C,B);
            str1 = str1.replace('M',C);

           str=str.concat(str1);




    }
    public static void readMethod()

    {
        for (int i = 0; i < str.length(); i=i+5) {
String str1="";
            str1=substr(str,i, 5);
            System.out.println(str1);
        }




    }
}

 次数减少了,但时间比上面的多了一些(可能字符串拼接效率不高吧。。。)

举报

相关推荐

0 条评论