有人說遞迴就是有去(遞去)有回(歸來)。
所以遞迴過程可以分解為兩部分,一部分為分解,一部分為求解。
具體來說,為什麼可以有去?
這要求遞迴的問題需要是可以用同樣的解題思路來回答除了規模大》小不同其他完全一樣的問題。
為什麼可以有回?
這要求這些問題不斷從大到小,從近及遠的過程中,會有乙個終點,乙個臨界點,乙個baseline,乙個你到了那個點就不用再往更小,更遠的地方走下去的點,然後從那個點開始,原路返回到原點。
所以我們考慮的僅僅是乙個大的問題,然後把這個問題去拆分為相同的小問題即可,這才是遞迴的思想。如果將其用程式表達出來,則可表示為
1.針對所給問題,確定問題的解空間:首先應明確定義問題的解空間,問題的解空間應至少包含問題的乙個(最優)解。
2確定結點的擴充套件搜尋規則
3以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。
實際例子1:揹包問題int a[n];
try(int i) }}
}
實際例子2:八皇后問題#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);
}
參#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 我們原本是希望編寫乙個函式,...