經典演算法之遞迴(Recursion)

2021-08-20 19:45:25 字數 1930 閱讀 1345

1、遞迴的定義

遞迴:你開啟面前這扇門,看到屋裡面還有一扇門(這門可能跟前面開啟的門一樣大小(靜),也可能門小了些(動)),你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門,你繼續開啟,。。。, 若干次之後,你開啟面前一扇門,發現只有一間屋子,沒有門了。 你開始原路返回,每走回一間屋子,你數一次,走到入口的時候,你可以回答出你到底用這鑰匙開了幾扇門。

迴圈:你開啟面前這扇門,看到屋裡面還有一扇門,(這門可能跟前面開啟的門一樣大小(靜),也可能門小了些(動)),你走過去,發現手中的鑰匙還可以開啟它,你推開門,發現裡面還有一扇門,(前面門如果一樣,這門也是一樣,第二扇門如果相比第一扇門變小了,這扇門也比第二扇門變小了(動靜如一,要麼沒有變化,要麼同樣的變化)),你繼續開啟這扇門,。。。,一直這樣走下去。 入口處的人始終等不到你回去告訴他答案。

2、遞迴的思想

遞迴的基本思想是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同乙個方法,所以就產生了函式呼叫它自身的情況。另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。

3、遞迴的要素

(1)明確遞迴終止條件

我們知道,遞迴就是有去有回,既然這樣,那麼必然應該有乙個明確的臨界點,程式一旦到達了這個臨界點,就不用繼續往下遞去而是開始實實在在的歸來。換句話說,該臨界點就是一種簡單情境,可以防止無限遞迴。

(2)給出遞迴終止時的處理辦法

我們剛剛說到,在遞迴的臨界點存在一種簡單情境,在這種簡單情境下,我們應該直接給出問題的解決方案。一般地,在這種情境下,問題的解決方案是直觀的、容易的。

(3)提取重複的邏輯,縮小問題規模

我們在闡述遞迴思想內涵時談到,遞迴問題必須可以分解為若干個規模較小、與原問題形式相同的子問題,這些子問題可以用相同的解題思路來解決。從程式實現的角度而言,我們需要抽象出乙個乾淨利落的重複的邏輯,以便使用相同的方式解決子問題。

function

recursion

(大規模)else

}

function

recursion

(大規模)else

}

4、遞迴的經典應用一道二叉樹的題型,列印出根到葉等於5的所有節點:

#include 

using

namespace

std;

vector

> g_vec;

const

int target = 5;

class treenode

};void foreach(treenode *pnode, int target, vector

vec)

return;

}vec.push_back(pnode->val);

if (pnode->left)

foreach(pnode->left, target - pnode->val, vec);//注意引數的變化。

if (pnode->right)

foreach(pnode->right, target - pnode->val, vec);

}int main(int argc, char

const *argv)

return

0;}

參考:

經典演算法之遞迴演算法

前言何為遞迴?通俗理解就是在滿足某一條件的基礎上,重複執行某一 塊,直到不符合執行的條件為止。在開發過程中,很多場景會運用遞迴演算法來解決實際專案需求 但是遞迴有著最為致命的缺點,如果使用不慎,會使專案一直重複執行遞迴函式,直到系統丟擲stack over flow,所以在運用遞迴的時候,要慎之又慎...

經典演算法 總結之遞迴演算法

如題 遞迴函式往往可以簡化我們的 尤其是對樹的遍歷和利用回溯演算法寫 的時候,但是遞迴函式的返回值往往是困擾我們的。總體來說,我們先要理解函式的呼叫過程,函式呼叫過程會用棧來儲存函式的返回值和過程,而遞迴函式就是呼叫自身函式的過程,所以也是用棧儲存,這樣就比較容易理解了。下面一段 可以幫助大家理解遞...

經典演算法系列之 遞迴

1 前言 演算法,在計算機中的地位,就相當於人類大腦的決策中樞系統,哪怕最簡單的演算法,其精妙的思維方式,都可以讓人開啟一扇新的視窗。演算法,它不僅僅只是狹義的用來解決電腦科學領域的問題,更是一種 思維方式 演算法思維,是一種深度思考和創造的過程。演算法,只有真正理解了,而不只是所謂的知道,並將應用...