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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈递归

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

定義

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

具體到計算機中去:

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

[以上定義來源為wiki].

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

遞歸思想

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

遞歸在程序中的表現(xiàn):在函數實現(xiàn)遞歸時,因為解決大問題的方法和解決小問題的方法往往是同一個方法,所以就產生了函數調用它自身的情況.需要注意的是,遞歸函數必須有明顯的結束條件(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循環(huán)

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

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

?

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

  • 循環(huán)的終止條件與遞歸中的基線條件
  • 循環(huán)中的算法與遞歸的算法

應用

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

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

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

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

參考資料:

? ?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位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

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

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