日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

浅谈递归

發布時間:2025/6/17 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈递归 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義

英文定義:Recursion is the process of repeating items in a self-similar way.

具體到計算機中去:

遞歸:又稱為遞回,在數學和計算機科學中,是指在函數的定義中使用函數自身的方法.

[以上定義來源為wiki].

英文的Recursion表達的是重復發生,再次重現的意思.而對應的中文翻譯”遞歸”確表達了兩個意思:” 遞”+”歸”.這兩個意思,正是遞歸思想的精髓.

遞歸思想

遞歸的基本思想是:把規模大的問題轉化為規模小的相似的子問題來解決.這種思想與數學中的歸納法十分相近。

遞歸在程序中的表現:在函數實現遞歸時,因為解決大問題的方法和解決小問題的方法往往是同一個方法,所以就產生了函數調用它自身的情況.需要注意的是,遞歸函數必須有明顯的結束條件(base case),避免產生無限遞歸的情況.

經典示例:N的階乘問題

??? 我們知道5!=5*4*3*2*1;4!=4*3*2*1;…

?????????? ?5!=5*4!...

??? 從上面我們可以歸納出N!=N*(N-1)!,由此函數的代碼如下:

public static long factorial(int n){if(n==1) // base casereturn 1;else // reduction stepreturn n*factorial(n-1);}

Base case:基線條件,遞歸的終止條件

Reduction step:遞歸操作,對問題的定義.

遞歸vs循環

???????? 從大多數情況來看,遞歸和循環是可以相互轉換的.例如上面的階乘問題,如果計算的階乘的方法是n!=n*(n-1)*….*2*1,就明顯是一個循環的過程,如果計算階乘的方法是n=n*(n-1)!,這就歸納出了一個遞歸定義。循環要求思考一個問題怎么做,而遞歸要求思考一個問題的定義(某Lisp開發者說的).

???????? 實際開發中,循環更加常見,但有些情況下,可能需要將循環轉為遞歸(面試).遞歸與循環其實想通的地方挺多,它們都需要初始條件和終止條件.用遞歸解決循環問題,需要明確基線條件和定義遞歸問題(每一步遞歸操作的算法),本人在面試過程中遇到過一個這樣問題:求兩個數的最大公約數,不使用循環.其實,從后面那句”不使用循環”就明顯是考遞歸的。Java代碼如下:

// 輾轉相除法求兩個數的最大公約數public static int gcd(int num1,int num2){// check argsif(num1==0 || num2==0){return 0;}// num1>num2int tmp = num1;num1 = Math.max(num1,num2);num2 = Math.min(tmp, num2);int p = num1%num2;/*while(p!=0){num1 = num2;num2 = p ;p = num1%num2;}*/if(p!=0)return gcd(num2,p);return num2;}

?

從上面可以看到,循環轉遞歸時要把握兩個點:

  • 循環的終止條件與遞歸中的基線條件
  • 循環中的算法與遞歸的算法

應用

當問題的定義本身就是遞歸形式的時候,可以考慮使用遞歸.數據結構里面的“樹”就是典型的遞歸定義。還有如上面說的階乘,漢諾塔問題,斐波拉契數列等.都可以使用來遞歸解決問題.

使用遞歸可以使用緊湊和優雅的代碼來解決看起來很”嚇人”的問題.但實際中,遞歸并不十分常見.首先,函數執行過程中,棧空間的分配是有限的,如果遞歸的深度過大,就會造成棧空間的溢出.其次,遞歸提高了程序的書寫效率,但并不意味著執行效率的提高.一般來說,遞歸的執行效率未必比循環高,因為在棧上開辟新空間、分配局部變量都是需要時間開銷的,特別是遞歸深度很大的時候。所以,學習遞歸主要是學習其思想—把規模大的問題轉化為規模小的相似子問題來解決。

借鑒知乎上某資深碼農的一句話,個人覺得說的很好:

???????? 當你的問題分析透徹,何時使用遞歸就會自然明了。遞歸只是一種函數調用的技巧,不是解決問題的公式。一個問題可以用遞歸做,也可以不用遞歸做,遞歸不是必須的。所以,理解你需要解決的問題,想清楚解決問題的步驟方法,你會突然發現,原來可以用遞歸來簡化問題。不要一開始就想著如何用遞歸。

參考資料:

? ?http://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92

? ?http://www.zhihu.com/question/20507130

? ?http://www.zhihu.com/question/20096035

? ?http://www.ibm.com/developerworks/cn/linux/l-recurs.html

轉載于:https://www.cnblogs.com/heavenyes/p/3822663.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的浅谈递归的全部內容,希望文章能夠幫你解決所遇到的問題。

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