<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    dengyin2000

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      1 隨筆 :: 0 文章 :: 1 評(píng)論 :: 0 Trackbacks

    Java軟件結(jié)構(gòu):設(shè)計(jì)和使用數(shù)據(jù)結(jié)構(gòu)(第2版)》讀書(shū)筆記1-遞歸

      大學(xué)的數(shù)據(jù)結(jié)構(gòu)和算法根本就是混過(guò)來(lái)的,某天在某某論壇里有個(gè)關(guān)于數(shù)據(jù)結(jié)構(gòu)和算法到底在日常的編程到底有多大的用處。對(duì)于我來(lái)說(shuō),我并不覺(jué)得我用上了那些講的數(shù)據(jù)結(jié)構(gòu)和算法。Java Collection Framework已經(jīng)跟我們做了這些。我已經(jīng)能非常熟練的使用Collection里面的類(lèi)庫(kù)。但是我們用的基本上都是那些線性集合(堆棧,隊(duì)列,列表,Set),非線性集合(樹(shù),堆,散列和圖)我感覺(jué)比較少用到。我也主要是想對(duì)非線性集合做一些比較。線性集合比較簡(jiǎn)單。

     

      第一章到第九章都是講線性集合, 也比較容易理解, 在這里就忽略掉。第十章是講遞歸算法。我對(duì)這章比較感興趣,用遞歸實(shí)現(xiàn)某個(gè)算法真的感覺(jué)非常優(yōu)雅,代碼短而少,許多非線性集合都是用遞歸來(lái)實(shí)現(xiàn)的。但也有他的缺點(diǎn), 對(duì)方法的每次遞歸調(diào)用都會(huì)生成新的局部變量和局部參數(shù)。假如遞歸層次太多的話,就會(huì)消耗太多的stack

     

    任何遞歸定義都必須有一個(gè)非遞歸部分;這個(gè)非遞歸部分叫做基本情況,它使的遞歸跳出無(wú)窮循環(huán)遞歸。

    Ex 1 1~N的累加過(guò)程,數(shù)值1N的累加可以看成是1N1的累加加上N

     

           public int sum(int num){

                  
    int result = 0;

                  
    if (num == 1){

                         
    return 1;

                  }


                  
    return result + num + sum(num - 1);

           }

    這里的基本情況就是但num==1的時(shí)候。 當(dāng)然這個(gè)可以不用遞歸來(lái)處理,用一個(gè)for就行了(而且比用遞歸更直觀)。我們必須能判斷什么時(shí)候使用遞歸,什么時(shí)候不使用遞歸,所有問(wèn)題都可以使用迭代(for循環(huán))解決問(wèn)題。不過(guò)有些情況下,迭代方式過(guò)于復(fù)雜,對(duì)某些問(wèn)題,遞歸可以寫(xiě)出短小而優(yōu)雅的代碼。

     

    直接遞歸和間接遞歸,方法調(diào)用自己,這就是直接遞歸(如上個(gè)例子)。方法調(diào)用另一個(gè)方法,最終導(dǎo)致再調(diào)用原方法。這就是間接遞歸。

     

    河內(nèi)塔問(wèn)題(Towers of Hanoi)(可以上網(wǎng)找找這個(gè)經(jīng)典問(wèn)題的描述)

    規(guī)則:

    l         一次只能移動(dòng)一張圓盤(pán)

    l         不能將大盤(pán)放在小盤(pán)的上方

    l         除了那張?jiān)谥又g搬動(dòng)的圓盤(pán)之外,所有圓盤(pán)都必須在某根柱子上

     

    策略:

    l         將最上方的N1張圓盤(pán)從最初的柱子移到那根多處的柱子上

    l         將最大的圓盤(pán)從最初的柱子移動(dòng)到最終的柱子上

    l         再將那個(gè)多出柱子上的N1張圓盤(pán)移到最終的柱子上

     

    Code

    public      class TowersOfHanoi{

                  
    private int totalDisks;

                  
    // ------------------------------------------------------

                  
    // Sets up the puzzle with the specified number of disks

                  
    // ------------------------------------------------------

                  
    public TowersOfHanoi(int disks){

                         
    this.totalDisks = disks;

                  }


                  
    // ----------------------------------------------------------

                  
    // Performs the initial call to moveTower to solve the puzzle.

                  
    // Moves the disks from tower 1 to tower 3 using tower 2

                  
    // ----------------------------------------------------------

                  
    public void solve(){

                         moveTower(totalDisks, 
    13,2);

                  }


                  
    // -----------------------------------------------------------------

                  
    // Moves the specified number of disks from one tower to another by 

                  
    // moving a subtower of n-1 disks out of the way, moving one disk, 

                  
    // then moving the subtower back, Base case of 1 disk.

                  
    // -----------------------------------------------------------------

                  
    private void moveTower(int numDisks, int start, int end, int temp) {

                         
    if (numDisks == 1){

                                moveOneDisk(start, end);

                         }
    else{

                                moveTower(numDisks
    -1, start, temp, end);

                                moveOneDisk(start, end);

                                moveTower(numDisks
    -1, temp, end, start);

                         }


                  }


                  
    private void moveOneDisk(int start, int end) {

                         System.out.println(
    "Move one disk from " + start + " to " + end);

                  }


           }

    posted on 2006-03-12 12:24 鄧胤 閱讀(371) 評(píng)論(1)  編輯  收藏

    評(píng)論

    # re: 《Java軟件結(jié)構(gòu):設(shè)計(jì)和使用數(shù)據(jù)結(jié)構(gòu)(第2版)》讀書(shū)筆記1-遞歸 2008-04-02 12:57 larrycheung
    我也在看這本書(shū),希望可以和您交流,另外請(qǐng)問(wèn)您有這本書(shū)的代碼嗎?
    如果方便的話給我發(fā)一份行嗎?
    我的郵箱larrycheung@163.com  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 无码亚洲成a人在线观看| 成人毛片免费视频| 高潮毛片无遮挡高清免费视频| 亚洲一区二区中文| 在线观看国产区亚洲一区成人| 四虎在线视频免费观看| 在线免费观看国产| jizz18免费视频| 朝桐光亚洲专区在线中文字幕 | 亚洲午夜精品久久久久久app| 亚洲Av熟妇高潮30p| 亚洲精品视频在线看| 精品国产免费观看| www.黄色免费网站| 91短视频免费在线观看| 精品国产免费一区二区三区香蕉| 日韩a毛片免费观看| 在线观看亚洲精品专区| 亚洲小说图区综合在线| 激情五月亚洲色图| 亚洲卡一卡二卡乱码新区| 亚洲AV无码成人专区| 亚洲成a人片7777| 久久亚洲精品无码VA大香大香| 亚洲国产精品无码av| 国产亚洲av人片在线观看| 日韩精品亚洲aⅴ在线影院| 亚洲日韩国产成网在线观看| 免费人妻av无码专区| 免费国产a国产片高清| 国产aa免费视频| 免费在线不卡视频| 亚洲AV之男人的天堂| 免费在线精品视频| 亚洲裸男gv网站| 国产午夜亚洲不卡| 国产成人精品日本亚洲网站| 亚洲AV永久青草无码精品| 亚洲人成网站影音先锋播放| 自怕偷自怕亚洲精品| 亚洲乱码无限2021芒果|