全递归(Exhaustive Recursive)、回溯(Backtracking)与搜索
无论是子集(组合)问题还是排列问题,如果要输出其所有可能的递归结果,就称之为全递归,其相当于访问相应递归树的所有叶子结点。有一类建立在递归树上的问题是只要获取所有结果中的一个或几个就可以得到相应解了,这类问题用部分递归(Partial Recursive)就可以求解。它相当于在根据相关条件的约束下,访问到递归树的某一个或几个叶子结点。一旦找到想要的解,就终止所有其他的递归调用并返回结果即是所谓的回溯法(Backtracking),带返回值的递归函数就用来执行此类任务。
比较经典的8皇后问题,就是用所谓的回溯法来解的,8皇后属于排列问题,因此回溯法也是在此基础上展开的。给出算法:
bool solve(Grid<bool>& board, int col)
{
if(col >= board.numCols()) return true;
for( int rowTotry = 0; rowTotry<board.numRows(); rowTotry++)
{
if( IsSafe(board, rowTotry, col) )
{
PlaceQueen( board, rowTotry, col );
if( solve(board, col+1) ) return true;