日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

迭代是人,递归是神(迭代与递归的总结:比较)

發布時間:2023/11/28 生活经验 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迭代是人,递归是神(迭代与递归的总结:比较) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.cnblogs.com/Renyi-Fan/p/7708012.html

?

在計算機編程實現中有常常兩種方法:一曰迭代(iterate);二曰遞歸(recursion)。

?

從“編程之美”的角度看,可以借用一句非常經典的話:“迭代是人,遞歸是神!”來從宏觀上對二者進行把握。

?

從概念上講,遞歸就是指程序調用自身的編程思想,即一個函數調用本身;迭代是利用已知的變量值,根據遞推公式不斷演進得到變量新值得編程思想。

?

從直觀上講,遞歸是將大問題化為相同結構的小問題,從待求解的問題出發,一直分解到已經已知答案的最小問題為止,然后再逐級返回,從而得到大問題的解(一個非常形象的例子就是分類回歸樹 classification and regression tree,從root出發,先將root分解為另一個(root,sub-tree),就這樣一直分解,直到遇到leafs后逐層返回);而迭代則是從已知值出發,通過遞推式,不斷更新變量新值,一直到能夠解決要求的問題為止。

?

以斐波那契數列的求解為例,通過兩種典型的實現進行對比:

?

?

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2);

?

遞歸的實現

[objc]?view plain?copy
  1. int?fib(int?n){??
  2. ?????if(n>1)?return?fib(n-1)?+?fib(n-2);??
  3. ?????else?return?n;?//?n?=?0,?1時給出recursion終止條件??
  4. }??

?

迭代的實現

?

[objc]?view plain?copy
  1. int?fib(int?n){??
  2. ????int?i,?temp0,?temp1,?temp2;????????
  3. ????if(n<=1)?return?n;??
  4. ????temp1?=?0;??
  5. ????temp2?=?1;??
  6. ????for(i?=?2;?i?<=?n;?i++){??
  7. ????????temp0?=?temp1?+?temp2;??
  8. ????????temp2?=?temp1;??
  9. ????????temp1?=?temp0;??
  10. ????}??
  11. ????return?temp0;??
  12. }??

?

下面就對遞歸和迭代進行比較:

?

遞歸實際上不斷地深層調用函數,直到函數有返回才會逐層的返回,因此,遞歸涉及到運行時的堆棧開銷(參數必須壓入堆棧保存,直到該層函數調用返回為止),所以有可能導致堆棧溢出的錯誤;但是遞歸編程所體現的思想正是人們追求簡潔、將問題交給計算機,以及將大問題分解為相同小問題從而解決大問題的動機。

?

迭代大部分時候需要人為的對問題進行剖析,將問題轉變為一次次的迭代來逼近答案。迭代不像遞歸一樣對堆棧有一定的要求,另外一旦問題剖析完畢,就可以很容易的通過循環加以實現。迭代的效率高,但卻不太容易理解,當遇到數據結構的設計時,比如圖‘表、二叉樹、網格等問題時,使用就比較困難,而是用遞歸就能省掉人工思考解法的過程,只需要不斷的將問題分解直到返回就可以了。

?

總之,遞歸算法從思想上更加貼近人們處理問題的思路,而且所處的思想層級算是高層(神),而迭代則更加偏向于底層(人),所以從執行效率上來講,底層(迭代)往往比高層(遞歸)來的高,但高層(遞歸)卻能提供更加抽象的服務,更加的簡潔。

?

從個人來講,我非常認同“迭代是人,遞歸是神”!

總結

以上是生活随笔為你收集整理的迭代是人,递归是神(迭代与递归的总结:比较)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。