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

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

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

    dengyin2000

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

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

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

     

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

     

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

    Ex 1 1~N的累加過程,數(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è)可以不用遞歸來處理,用一個(gè)for就行了(而且比用遞歸更直觀)。我們必須能判斷什么時(shí)候使用遞歸,什么時(shí)候不使用遞歸,所有問題都可以使用迭代(for循環(huán))解決問題。不過有些情況下,迭代方式過于復(fù)雜,對某些問題,遞歸可以寫出短小而優(yōu)雅的代碼。

     

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

     

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

    規(guī)則:

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

    l         不能將大盤放在小盤的上方

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

     

    策略:

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

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

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

     

    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 鄧胤 閱讀(370) 評(píng)論(1)  編輯  收藏

    評(píng)論

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产午夜不卡AV免费| 热re99久久6国产精品免费| 红杏亚洲影院一区二区三区| 午夜不卡AV免费| 久久亚洲精品成人AV| 国产成人无码区免费A∨视频网站| 又大又硬又粗又黄的视频免费看| 亚洲网址在线观看你懂的| 白白国产永久免费视频| 国产免费福利体检区久久| 亚洲欧洲日本精品| 亚洲午夜精品一级在线播放放| 69国产精品视频免费| 一级毛片免费在线播放| 亚洲精品午夜久久久伊人| 国产女高清在线看免费观看| 99精品视频免费观看| 黄色免费在线观看网址| 亚洲精品国产成人| 亚洲国产精品成人| 中文字幕无码成人免费视频| 成人妇女免费播放久久久| 亚洲成人免费网址| 伊伊人成亚洲综合人网7777| 卡一卡二卡三在线入口免费| 免费国产污网站在线观看15 | 亚洲人成在线播放网站岛国| 国产伦精品一区二区三区免费迷 | 国产精品成人免费观看| 中文字幕亚洲男人的天堂网络| 亚洲日韩精品A∨片无码| 国产一区二区三区免费在线观看| 99久久精品免费精品国产| 精品久久久久久无码免费| 亚洲av无码一区二区三区在线播放 | 男人的好看免费观看在线视频| 国产偷伦视频免费观看| 四虎成人精品国产永久免费无码| 亚洲日韩看片无码电影| 亚洲白色白色永久观看| 久久精品亚洲综合专区|