<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      (c#)數(shù)據(jù)結(jié)構(gòu)與算法分析 --遞歸

      遞歸
          不知道有新手聽沒聽過別人拿剝糖塊來形容遞歸,諸如一層層地剝好比一層層地進入遞歸。這種比喻可是誤導了我,只想著剝了,其實剝完皮兒,取出糖塊,再把皮兒一層層地穿上才算個完整的遞歸。    

          遞歸就是自己調(diào)用自己的函數(shù)或方法了,一般情況,像我這樣的新手剛接觸遞歸的時候,迷就迷在了不明白遞歸的原理上,在 (c#)數(shù)據(jù)結(jié)構(gòu)與算法分析 --棧與隊列 中說過,編譯器一般用棧來實現(xiàn)遞歸,具體就看那篇文章吧。

          這里先舉一個用到遞歸的例子。

          求第n項的三角數(shù)字,三角數(shù)字就是數(shù)列中,第n項的值是第n-1項加上n得來的。這里可不是那個斐波那契數(shù)列。
          1,3,6,10,15,21......... 這些個數(shù)就是三角數(shù)字。

          這個遞歸方法就是計算第n項的三角數(shù)字:
       1 //使用遞歸求第n項的三角數(shù)
       2 private int triangle(int n)
       3         {
       4             if (n == 1//這是遞歸的基準情形,一個遞歸沒有基準的話,就沒法跳出遞歸。
       5             {
       6                 return n;
       7             }
       8             else
       9             {
      10                 return (n + triangle(n - 1)); //調(diào)用本方法
      11             }
      12         }

      很簡單的一個算法,可用 第n個三角數(shù)字=(n*n+n)/2 這個公式來驗證其正確性。

      仔細看看這個圖就會完全明白遞歸到底怎么遞歸了。

      n=5時,開始調(diào)用

      第1層

      n=5

      第2層

      n=4

      第3層

      n=3

      第4層

      n=2

      第3層

      n=1

      返回 1
      加 2
      返回 3
      加 3
      返回 6
      加 4
      返回 10
      加 5
      返回 15


      返回15
      (這個表格在firefox下顯示有點問題)


          這時,應該把遞歸理順了吧,自己可以試試用遞歸求階乘,然后試著解決漢諾塔問題,google搜一下會有很多漢諾塔問題的源碼。

          很明顯,上面那個遞歸是尾遞歸,在某些情況下,比如函數(shù)體比較龐大,有很多局部變量,則很容易引起棧溢出。有時候應該消除遞歸。
         
          這就用到棧了,下面這個源碼,功能和上面一樣,只不過用棧來消除遞歸了。
       1 //消除遞歸,使用棧代替遞歸
       2         private int triangleStack(int n)
       3         {
       4             Stack<int> traingle = new Stack<int>(); //這個棧來模擬遞歸中的環(huán)境變量
       5 
       6             while (n >= 1//相當于遞歸中的基準了
       7             {
       8                 traingle.Push(n); //將每次遞減的值壓入棧,相當于逐層調(diào)用遞歸
       9                 n = n - 1;
      10             }
      11 
      12             while (traingle.Count > 0//這個相當于逐層跳出遞歸
      13             {
      14                 n = n + traingle.Pop(); //計算
      15             }
      16 
      17             return n;
      18         }

          不是很難吧,主要把遞歸的原理理清,思路自然就明了了。

          要注意的是,使用遞歸千萬可別忘了基準情形,不然就永遠遞歸不出來了。遞歸的效率有時候比較低,這樣就可以用棧或循環(huán)來代替遞歸了。

      posted on 2008-04-17 20:34  黑暗伯爵  閱讀(3051)  評論(2)    收藏  舉報

      導航

      主站蜘蛛池模板: 亚洲国产精品高清久久久| 116美女极品a级毛片| 日韩毛片在线视频x| 亚洲人成网线在线播放VA| 久久人人爽爽人人爽人人片av| 中文字幕人妻色偷偷久久| 亚洲欧美高清在线精品一区二区| 国产亚洲精品第一综合| 18禁一区二区每日更新| 午夜精品一区二区三区成人| 亚洲人成人伊人成综合网无码| 老熟妇乱子交视频一区| 国产av一区二区三区久久| 欧美老熟妇乱子伦牲交视频| 日本美女性亚洲精品黄色| 乱码精品一区二区三区| 人人爽天天碰天天躁夜夜躁| 亚洲国产精品一区二区久| 无码免费大香伊蕉在人线国产| 蜜臀久久99精品久久久久久| 国产JJIZZ女人多水喷水| 亚洲av日韩av永久无码电影| 色偷偷成人综合亚洲精品| 在线视频中文字幕二区| 国产日韩精品中文字幕| 成人国产精品三上悠亚久久 | gogo无码大胆啪啪艺术| 国内熟妇人妻色在线三级| 免费国产一级特黄aa大片在线| 亚洲午夜香蕉久久精品| 国产精品成人中文字幕 | 国内自拍av在线免费| 美女内射毛片在线看免费人动物| 精品无码老熟妇magnet| 青青草原国产AV福利网站| 日本熟妇XXXX潮喷视频| 老熟妇国产一区二区三区 | 亚洲色大成网站www永久男同| 国产精品久久国产精品99 gif| 国产精品日韩中文字幕熟女| 青青国产揄拍视频|