真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么用Java遞歸方法實(shí)現(xiàn)漢諾塔

這篇文章主要介紹“怎么用Java遞歸方法實(shí)現(xiàn)漢諾塔”,在日常操作中,相信很多人在怎么用Java遞歸方法實(shí)現(xiàn)漢諾塔問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用Java遞歸方法實(shí)現(xiàn)漢諾塔”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、澄江網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為澄江等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

遞歸(recursion):程序調(diào)用自身的編程技巧。

  1. 反復(fù)執(zhí)行的過程(調(diào)用自身)

  2. 有跳出反復(fù)執(zhí)行過程的條件(遞歸出口)

import com.lifeibigdata.algorithms.leetcode.TreeNode;
public class Recursive {

    public static void main(String[] args) {
//        System.out.println(factorial(3));
//        tower(2,'A','B','C');
//        perm(new int[]{1,2,3},0,2);
//        System.out.println(fib(2));
//        System.out.println(fib_i(1,1,7));
        System.out.println(factorial_tail(3,1,1));
//        System.out.println(is_palindereme(""));
//        System.out.println(binary_search(new int[]{1,2,3,4,5},4));
//        System.out.println(binSearch(new int[]{1,2,3,4,5},0,4,6));
    }

    /**
     * 階乘
     * n! = n * (n-1) * (n-2) * ...* 1(n>0)
     *
     */
    static int factorial(int x){
        if (0 == x){
            return 1;
        } else {
            return x*factorial(x - 1);
        }
    }

    // 迭代計(jì)算過程
    static int factorial2(int n){
        return factIterator(1, 1, n);
    }

    static int factIterator(int result, int counter, int maxCount){
        if(counter > maxCount){
            return result;
        }
        return factIterator((counter * result), counter + 1, maxCount);
    }

    /**
     * 漢諾塔問題
     *
     *當(dāng)n=1時(shí),將A上的盤子直接移動(dòng)到C上
     *當(dāng)n>=2時(shí):
     *1,將A上n-1個(gè)盤子移動(dòng)到B上(此步驟的解決辦法與移動(dòng)n階盤子的方法完全一樣,只是問題的規(guī)模減小1階)
     *2,將A上的一個(gè)盤子移動(dòng)到C
     *3,將B上的n-1個(gè)盤子移動(dòng)到C上。
     *
     */
    public static void tower(int n,char one,char two,char three){
        if(n==1){
            move(one,three,1);
        }else{
            tower(n-1,one,three,two);   //把第1個(gè)移動(dòng)到第2個(gè)
            move(one,three, n);         //將第n個(gè)盤,從第1個(gè)移動(dòng)到第3個(gè)柱子
            tower(n-1,two,one,three);   //把第2個(gè)移動(dòng)到第3個(gè)
        }
        System.out.println("---");
        /**
         *
         A的第1盤移動(dòng)到C
         A的第2盤移動(dòng)到B
         C的第1盤移動(dòng)到B

         A的第3盤移動(dòng)到C
         B的第1盤移動(dòng)到A
         B的第2盤移動(dòng)到C
         A的第1盤移動(dòng)到C
         */
    }
    //輸出
    public static void move(char x,char y, int n){
        System.out.println(x+"的第"+n+"盤移動(dòng)到"+y);
    }


    /**
     * 全排列問題
     * http://blog.csdn.net/xiazdong/article/details/7986015
     */
    static void swap(int a,int b,int arr[])
    {
        int temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }
    public static void perm(int arr[], int begin,int end) {
        if(end==begin){         //一到遞歸的出口就輸出數(shù)組,此數(shù)組為全排列
            for(int i=0;i<=end;i++){
                System.out.print(arr[i]+" ");
            }
            System.out.println();
            return;
        }
        else{
            for(int j=begin;j<=end;j++){
                swap(begin,j,arr);      //for循環(huán)將begin~end中的每個(gè)數(shù)放到begin位置中去
                perm(arr,begin+1,end);  //假設(shè)begin位置確定,那么對begin+1~end中的數(shù)繼續(xù)遞歸
                swap(begin,j,arr);      //換過去后再還原
            }
        }
    }


    /**
     * 斐波納契數(shù)列,又稱黃金分割數(shù)列
     *
     * 這個(gè)數(shù)列從第三項(xiàng)開始,每一項(xiàng)都等于前兩項(xiàng)之和
     * 斐波那契數(shù)列這樣定義:f(0) = 0, f(1) = 1, 對n > 1, f(n) = f(n-1) + f(n-2)
     * 1、1、2、3、5、8、13
     */
    static long fib(int n) {
        if (n == 0)
            return 1;
        if (n == 1)
            return 1;
        if (n > 1)
            return fib(n-1) + fib(n-2);
        return 0;
    }

    static int fib_i(int a, int b , int n)
    {
        if(n == 2)
            return a+b;
        else
            return fib_i(b, a+b, n-1);
    }

    static int factorial_tail(int n,int acc1,int acc2)
    {
        if (n < 2)
        {
            return acc1;
        }
        else
        {
            return factorial_tail(n-1,acc2,acc1+acc2);
        }
    }

    /**
     *
     fibonacci(n-1,acc2,acc1+acc2)真是神來之筆,原本樸素的遞歸產(chǎn)生的棧的層次像二叉樹一樣,以指數(shù)級增長,但是現(xiàn)在棧的層次卻像是數(shù)組,變成線性增長了,
     實(shí)在是奇妙,總結(jié)起來也很簡單,原本棧是先擴(kuò)展開,然后邊收攏邊計(jì)算結(jié)果,現(xiàn)在卻變成在調(diào)用自身的同時(shí)通過參數(shù)來計(jì)算。
     小結(jié)
     尾遞歸的本質(zhì)是:將單次計(jì)算的結(jié)果緩存起來,傳遞給下次調(diào)用,相當(dāng)于自動(dòng)累積。
     在Java等命令式語言中,尾遞歸使用非常少見,因?yàn)槲覀兛梢灾苯佑醚h(huán)解決。而在函數(shù)式語言中,尾遞歸卻是一種神器,要實(shí)現(xiàn)循環(huán)就靠它了。
     */
//    def Fib(n,b1=1,b2=1,c=3):
//
//            if n <= 2:
//            return 1
//
//            else:
//            if n==c:
//            return b1+b2
//
//    else:
//            return Fib(n,b1=b2,b2=b1+b2,c=c+1)



    /**
     *
     *返回一個(gè)二叉樹的深度
     */

    int depth(TreeNode t){
        if(t == null) return 0;
        else {
            int a=depth(t.right);
            int b=depth(t.left);
            return (a>b)?(a+1):(b+1);
        }
    }

    /**
     *
     *判斷一個(gè)二叉樹是否平衡
     */
    int isB(TreeNode t){
        if(t == null) return 0;
        int left=isB(t.left);
        int right=isB(t.right);
        if( left >=0 && right >=0 && left - right <= 1 || left -right >=-1)
            return (left heigh-2) {
            if(a[low] > a[heigh]) max = a[low];
            else max = a[heigh];
        }else {
            int mid = (low + heigh)/2;
            int max1 = Max(a, low, mid);
            int max2 = Max(a, mid+1, heigh);
            max = max1>max2 ? max1 : max2;
        }
        return max;
    }
    /**
     * 數(shù)字塔問題
     *
     *
     * 用遞歸算法求解數(shù)字塔問題
     * @param n 數(shù)字塔的行數(shù)
     * @return 數(shù)字塔的字符串
     */
    public static String tourData(int n) {
        String str = new String();
        if(1 == n) {
            str = rowData(n) + "\n";
            return str;
        }
        else {
            str = tourData(n-1) + rowData(n) + "\n";
        }
        return str;
    }
    private static String rowData(int n) {
        String str = new String();
        for(int i=0; i target){
            int[] narr = new int[arr.length - mid];
            System.arraycopy(arr,0,narr,0,arr.length - mid);
            return binary_search(narr,target);
        } else if (arr[mid] < target){
            int[] narr = new int[arr.length - mid];
            System.arraycopy(arr,mid,narr,0,arr.length - mid);
            return binary_search(narr,target);
        }
        return false;
    }

    /**
     * 遞歸方法實(shí)現(xiàn)二分查找法.
     * @param low 數(shù)組第一位置
     * @param high 最高
     * @param key 要查找的值.
     * @return 返回值.
     */
    static int binSearch(int[] Array,int low,int high,int key)
    {
        if (low<=high)
        {
            int mid = (low+high)/2;
            if(key == Array[mid])
                return mid;
            else if(keyArray[mid])
                return binSearch(Array,mid+1,high,key);
        }
        return -1;
    }
//    static boolean binary_search(int[] arr,int arrlength,int target){
//        int mid;
//        if (arrlength == 1) {
//            return arr[0] == target;
//        } else {
//            mid = arrlength/2;
//            if (arr[mid-1] == target){
//                return true;
//            } else if (arr[mid - 1] > target){
//                return binary_search(arr,mid,target);
//            } else {
//                return binary_search(arr,arrlength - mid,target);
//            }
//        }
//    }
    /**
     * 兔子產(chǎn)子問題
     */
    /**
     * 走樓梯問題
     */
    /**
     * 在二元樹中找出和為某一值的所有路徑
     * http://z466459262.iteye.com/blog/1115316
     *
     */
/**
 * 純遞歸問題的難易主要糾結(jié)于一些條件表達(dá)式的構(gòu)造以及初值的設(shè)置(上面的為直接表達(dá)式值的設(shè)定)
 * 遞歸分兩步,遞和歸
 *
 * 遞歸算法的一般形式:
 void   func(mode){
 if(endCondition){
 constExpression       //基本項(xiàng)
 }
 else
 {
 accumrateExpreesion /歸納項(xiàng)
 mode=expression //步進(jìn)表達(dá)式
 func(mode) / /調(diào)用本身,遞歸
 }
 }
 */
}

到此,關(guān)于“怎么用Java遞歸方法實(shí)現(xiàn)漢諾塔”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


網(wǎng)站標(biāo)題:怎么用Java遞歸方法實(shí)現(xiàn)漢諾塔
標(biāo)題鏈接:http://weahome.cn/article/jodjos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部