遞歸(recursion)小結(jié)

1真椿、遞歸原理

函數(shù)調(diào)用自身。實質(zhì)是函數(shù)每次調(diào)用自身時干厚,都把一個問題分解為子問題李滴。然后我們通過子問題的解螃宙,向上去構(gòu)造大問題的解。

為了確保遞歸函數(shù)不會導致無限循環(huán)所坯,它應具有以下屬性:
一個簡單的基本案例(basic case) —— 能夠不使用遞歸來產(chǎn)生答案的終止方案谆扎。
一組規(guī)則,也稱作遞推關(guān)系(recurrence relation)芹助,可將所有其他情況拆分到基本案例堂湖。

2、遞歸函數(shù)

每當遞歸函數(shù)調(diào)用自身時状土,它都會將給定的問題拆解為子問題无蜂。遞歸調(diào)用繼續(xù)進行,直到到子問題無需進一步遞歸就可以解決的地步蒙谓。
遞歸分為三個步驟:
1斥季、結(jié)束條件(Base case)
也就是遞歸的終點,可以直接得到結(jié)果累驮,不需要進一步的遞歸調(diào)用就可以直接計算答案的情況酣倾。沒有結(jié)束條件,遞歸就會形成死循環(huán)谤专。有時躁锡,基本案例也被稱為 bottom cases。
2置侍、拆解
將問題拆解為小問題稚铣。
3、組合
通過遞推關(guān)系式墅垮,將小問題構(gòu)造為大問題惕医。
例題:反轉(zhuǎn)鏈表

迭代法:
三個指針:pre,cur,next

  • next先保存cur的下一個節(jié)點
  • cur->next再指向pre
  • pre=cur
  • cur=next;
    時間復雜度:O(n),空間復雜度:O(1)

遞歸法:
假設(shè)除了頭結(jié)點算色,其他節(jié)點都已經(jīng)被反轉(zhuǎn)抬伺。如何反轉(zhuǎn)頭結(jié)點與后面的鏈表?

  • 首先我們從后往前進行反轉(zhuǎn)
  • 后面的節(jié)點指向前一個節(jié)點:head->next->next=head;
  • 前一個節(jié)點不能指向后一個節(jié)點:head->next=nullptr;
    時間復雜度:O(n)灾梦,空間復雜度:O(n)
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(!head||!head->next)
            return head;
        ListNode* cur=reverseList(head->next);
        head->next->next=head;
        head->next=nullptr;
        return cur;
    }
};

3峡钓、記憶化

遞歸算法中存在重復計算問題。每一次遞歸都要從頭開始若河∧苎遥可以借助外部存儲,將已經(jīng)便利過的節(jié)點值存下來萧福,在遞歸中先判斷該點是否存儲過拉鹃。最后,將計算得到的值再進行存儲。
例題:斐波那契數(shù)列\(zhòng)爬樓梯
(1)遞歸膏燕。時間復雜度:O(2^n)钥屈。樹形遞歸的大小為 2^n “颖瑁空間復雜度:O(n)篷就。遞歸樹的深度可以達到 n 。
(2)記憶化遞歸近忙。時間復雜度:O(n)竭业。空間復雜度:O(n)及舍。
(3)動態(tài)規(guī)劃未辆。時間復雜度:O(n)』魑常空間復雜度:O(1)。

4钾麸、時間復雜度和空間復雜度

我自己的理解是:時間復雜度是語句最多執(zhí)行的次數(shù)更振。空間復雜度是存儲變量所需要的最大空間饭尝。
例如肯腕,把結(jié)構(gòu)中的每個變量遍歷一遍,時間復雜度是O(n)钥平。把它們?nèi)4娴綌?shù)組实撒,空間復雜度是O(n)。
時間復雜度:隨著自變量的增長涉瘾,算法所需時間的增長情況知态。 空間復雜度是指:
算法運行期間所需占用的所有內(nèi)存空間

5、尾遞歸

尾遞歸函數(shù)是遞歸函數(shù)的一種立叛,其中遞歸調(diào)用是遞歸函數(shù)中的最后一條指令负敏。并且在函數(shù)中應該只有一次遞歸調(diào)用。
尾遞歸的特點就是我們可以很容易的把它轉(zhuǎn)成 迭代(iterative )的寫法秘蛇,當然有些智能的編譯器會自動幫我們做了(不是說顯性的轉(zhuǎn)化其做,而是在運行時按照 iterative 的方式去運行,實際消耗的空間是 O(1))
尾遞歸的好處是赁还,它可以避免遞歸調(diào)用期間椦梗空間開銷的累積,因為系統(tǒng)可以為每個遞歸調(diào)用重用棧中的固定空間艘策。
為什么呢蹈胡?是因為在尾遞歸的情況下,一旦從遞歸調(diào)用返回,我們也會立即返回审残,因此我們可以跳過整個遞歸調(diào)用返回鏈梭域,直接返回到原始調(diào)用方。這意味著我們根本不需要所有遞歸調(diào)用的調(diào)用棧搅轿,這為我們節(jié)省了空間病涨。
》 參考文獻:這才是面試官想聽的:詳解「遞歸」正確的打開方式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市璧坟,隨后出現(xiàn)的幾起案子既穆,更是在濱河造成了極大的恐慌,老刑警劉巖雀鹃,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幻工,死亡現(xiàn)場離奇詭異,居然都是意外死亡黎茎,警方通過查閱死者的電腦和手機囊颅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傅瞻,“玉大人踢代,你說我怎么就攤上這事⌒峤荆” “怎么了胳挎?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溺森。 經(jīng)常有香客問我慕爬,道長,這世上最難降的妖魔是什么屏积? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任医窿,我火速辦了婚禮,結(jié)果婚禮上炊林,老公的妹妹穿的比我還像新娘留搔。我一直安慰自己,他們只是感情好铛铁,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布隔显。 她就那樣靜靜地躺著,像睡著了一般饵逐。 火紅的嫁衣襯著肌膚如雪括眠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天倍权,我揣著相機與錄音掷豺,去河邊找鬼捞烟。 笑死,一個胖子當著我的面吹牛当船,可吹牛的內(nèi)容都是我干的题画。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼德频,長吁一口氣:“原來是場噩夢啊……” “哼苍息!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起壹置,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤竞思,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钞护,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盖喷,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年难咕,在試婚紗的時候發(fā)現(xiàn)自己被綠了课梳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡余佃,死狀恐怖暮刃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咙冗,我是刑警寧澤沾歪,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布漂彤,位于F島的核電站雾消,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挫望。R本人自食惡果不足惜立润,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媳板。 院中可真熱鬧桑腮,春花似錦、人聲如沸蛉幸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奕纫。三九已至提陶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匹层,已是汗流浹背隙笆。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撑柔。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓瘸爽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铅忿。 傳聞我的和親對象是個殘疾皇子剪决,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容