再帰を理解し、N-クイーン問題からバックトラック

最も一般的な解決策の一つは、再帰的なn個の女王を使用することです、しかし、Nクイーン問題を解決し、主な機能は、多くの場合、一つだけの関数呼び出し文ました:

eight_queen(0、N);

はい、これだけの機能がnのクイーンズの結果を計算します、非常に不思議な感じではないですか?

これは再帰の美しさです。

実際には、慎重にコードを読んで、私たちは運転中に、これは単なる関数呼び出しではなく、この機能によってループを形成し、自分自身を呼び出すために続けて、その後、問題の解決策を見つける、ということでしょう。

私たちは、次のコードを見てみましょう:

ボイドeight_queen(INTインデックス、int型N)//インデックス是の行、nは表示要放N个皇后
{
    int型のループ;
    用(ループ= 0;ループ<N;ループ++)
    {
        IF(check_pos_valid(インデックス、ループ))
        {
            gEightQueen [インデックス] =ループ。
            (N-1 ==インデックス)であれば
            {
                gCount ++;印刷(N)
                返します。
            }
            eight_queen(インデックス+ 1、N)。
        }
    }
}

次のようにn = 4つの特定のコールプロセスです。

gEightqueen [0] = 0、gEightqueen [1] 2、gEightQueen [2] =いいえ溶液、ステップループの値をチェックし続けるに戻ります=。

                 gEightQueen [1] = 3は、gEightQueen [2] = 2、gEightQueen [3] =いいえ溶液、ループバックの値の後ろに一歩をチェックし続けます。

                                  gEightQueen [2]解決策を=ない、gEightQueen [1] = 0戻り、次の値ループをチェック継続するステップと

                 gEightQueen [1]のステップは、ノーリターンが存在しないループの値をチェック継続に戻り、解決策を=ありません。

gEightQueen [0] = 1、gEightQueen [1] = 3、gEightQueen [2] = 0、gEightQueen [3] = 2、インデックス= N-1、戻り、ここで戻り率をn-1の関数であることである//また、他の関数を呼び出します。

                                  gEightQueen [2]解決策を=ない、ステップループの値をチェックし続けるために戻ります。

                 gEightQueen [1] = NO溶液、ループ値の後ろに一歩をバックチェックし続けます。

gEightQueen [0] = 2、gEightQueen [1] = 0、gEightQueen [2] = 3、gEightQueen [3] = 1、インデックス= N-1を返し、ここで、インデックスは、n-1の関数を作ることである戻り//また、他の関数を呼び出します。

gEightQueen [0] = 3は、gEightQueen [1] = 0、gEightQueen [2] =いいえ溶液、ループバックの値の後ろに一歩をチェックし続けます。

                 gEightQueen [1] = 1は、gEightQueen [2] =いいえ溶液、ループ値の後ろに一歩をバックチェックし続けます。

                 gEightQueen [1] = NO溶液、ループ値の後ろに一歩をバックチェックし続けます。

gEightQueen [0]解決策を=ない、全体的な関数呼び出しが終了します。

再帰的なアイデアを要約したものです。

         仮定関数eight_queen(インデックスn)は、関数eight_queen(インデックスn)はBです。

         関数が呼び出されると、ループ現在の実行状況がある場合は、Bの別の関数内の関数を呼び出すことができ、完了していない、bが最初に呼び出されますが、関数Bが終了したときに、実行されていない機能のパフォーマンスを継続する、最も全ての場合において再び行われる最悪の場合、すべての関数であり、アルゴリズムの複雑さはO(N ^ N)であるが、全ての場合において、条件Bを満たすことができない機能を実行する機能は、B関数が実行されないので、実際の呼処理の複雑さはO(n個の* n)でより頻繁に小さいです

        手順は、プロセスのすべての可能な解決策を経て得られた多くの場合、バックトラック再帰の使用を含みます。

 

おすすめ

転載: www.cnblogs.com/xbnl-bk-zm-2018/p/11422235.html