遞迴之再探

2021-08-13 10:41:58 字數 2109 閱讀 1233

有人說

遞迴就是有去(遞去)有回(歸來)。

所以遞迴過程可以分解為兩部分,一部分為分解,一部分為求解

具體來說,為什麼可以有去

這要求遞迴的問題需要是可以用同樣的解題思路來回答除了規模大》小不同其他完全一樣的問題。

為什麼可以有回

這要求這些問題不斷從大到小,從近及遠的過程中,會有乙個終點,乙個臨界點,乙個baseline,乙個你到了那個點就不用再往更小,更遠的地方走下去的點,然後從那個點開始,原路返回到原點。

所以我們考慮的僅僅是乙個大的問題,然後把這個問題去拆分為相同的小問題即可,這才是遞迴的思想。

如果將其用程式表達出來,則可表示為

1.針對所給問題,確定問題的解空間:

首先應明確定義問題的解空間,問題的解空間應至少包含問題的乙個(最優)解。

2確定結點的擴充套件搜尋規則

3以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。

int a[n];

try(int i) }}

}

實際例子1:揹包問題

#include 

#include

using

namespace

std;

int sum = 0;

// 物品重量剛好的陣列

vector

bark;

void fun (vector

& tmp, int weight, int index)

// 如果剛好等於 滿足條件 輸出

else

if (sum == weight)

cout

<< endl;

} else }}

}int main ()

int weight;

cin >> weight;

fun(bag,weight,0);

}

實際例子2:八皇后問題

#include 

#define max 30

using

namespace

std;

class queens }}

bool is_solve()

void print()

cout

<< endl;

}cout

<< endl;

}bool ungarded(int col)

// 從左斜線往上是否有皇后

for (i = 1; ok && count - i >= 0 && col - i >= 0; ++i)

// 從右斜線往上是否右皇后

for (i = 1; ok && count - i >= 0 && col + i <= size; ++i)

return ok;

}void insert(int col)

void remove(int col)

int size;

private:

// count可以代表行數

int count;

bool square[max][max];

};// 遞迴函式

void solve_from (queens &test) else}}

}int main ()

遞迴之再探

遞迴是好理解還是不好理解?很多人說,遞迴很簡單,但是面對很多遞迴的題目,我卻覺得十分困難。遞迴是一種工具 我們有幾個步驟去做 1.首先,找出關鍵的步驟,這是演算法的核心,每一步都要迴圈的列子,即大問題分成小問題適用的演算法。2.然後找出停止規則,遞迴不能無限向前,必須停止,然後往回走。3.列出演算法...

STL之再探迭代器

迭代器被繫結到乙個容器上,可用來向容器插入元素。back inserter建立乙個使用push back的迭代器 front inserter建立乙個使用push front的迭代器 inserter建立乙個使用insert的迭代器,此函式接受哦第二個引數,這個引數必須是指向乙個給定容器的迭代器。元...

再探函式引數

c函式的所有引數均以 傳值呼叫 方式進行傳遞。這意味著函式將獲得引數值的乙份拷貝,這樣函式可以放心修改這個拷貝值,而不必擔心會修改呼叫程式實際傳遞給它的引數。普通資料型別主要包括 如下面 所示 include void swap int x int y int main 我們原本是希望編寫乙個函式,...