バックトラックと再帰の違いは何ですか?このプログラムはどのように機能していますか?
void generate_all(int n)
{
if(n<1) printf("%s\n", ar);
else{
ar[n-1]='0'; //fix (n)th bit as '0'
generate_all(n-1); //generate all combinations for other n-1 positions.
ar[n-1]='1'; //fix (n)th bit as '1'
generate_all(n-1); //generate all combinations for other n-1 positions.
}
その質問は、車とデロリアンの違いを尋ねるようなものです。
再帰関数では、基本ケースに到達するまで関数を呼び出します。
バックトラックでは、問題の最良の結果が得られるまで、すべての可能性を探るために再帰を使用します。
少しわかりにくいかもしれませんが、 ここ からのテキストを添付します。
「概念的には、ツリーのルートから開始します。ツリーには良い葉と悪い葉が含まれている可能性があります。 、ルートから始めて、移動する子の1つを選択し、葉に到達するまでこれを維持します。
悪い葉に到達したとします。最新の選択を取り消し、そのオプションセットの次のオプションを試すことにより、バックトラックして適切なリーフの検索を続けることができます。オプションが足りなくなった場合は、ここまでたどり着いた選択肢を取り消し、そのノードで別の選択肢を試してください。オプションが残っていない状態でルートになってしまうと、良い葉は見つかりません。」
これには例が必要です:
結果が目的に合わない場合は戻らないため、コードの一部は単に再帰です。
Recursionは、あなたがいるのと同じ関数の呼び出しを記述します。再帰関数の典型的な例は、階乗です。つまり、
_int fact(int n) {
int result;
if(n==1) return 1;
result = fact(n-1) * n;
return result;
}
_
あなたがここで見るのは、その事実がそれ自体を呼ぶということです。これがいわゆる再帰です。常に再帰を停止させる条件が必要です。ここでif(n==1)
は、呼び出されるたびにnが常に減少するという事実と結合されます(fact(n-1)
)
Backtrackingは、パラメータを指定して解を見つけようとするアルゴリズムです。ソリューションの候補を構築し、条件を満たすことができないものを放棄します。解決するタスクの典型的な例は、 Eight Queens Puzzle です。バックトラッキングは、ニューラルネットワーク内でも一般的に使用されます。
記述したプログラムは再帰を使用しています。階乗関数と同様に、引数を1つ減らし、n <1の場合は終了します(残りを実行する代わりにar
を出力するため)。
再帰-放棄された値はありません。
バックトラック-いくつかのソリューション候補を破棄します。
また、バックトラッキングは関数本体で複数回呼び出されることに注意してください。通常、再帰には当てはまりません。
私の理解では、バックトラッキングは、BFSやDFSなどの他のすべてのアルゴリズムと同様のアルゴリズムですが、再帰および反復もメソッドであり、それらはアルゴリズムよりも高いレベルにあります。たとえば、DFSを実装するには、再帰を使用できます、これは非常に直感的ですが、スタックで反復を使用することもできます。また、再帰と反復はアルゴリズムをサポートするための単なるメソッドであると考えることもできます。