8つのクイーンを解決するために再帰後戻り

今日、あなたは多くの場合、エラー・スタック・オーバーフローを投げ、再帰的な輸出条件、それが間違っ、原因の論理エラーを書き込む前に、必ず自分を入れ、8クイーン古典的な問題を学習し、再帰呼び出しの理解を強化します。

実際には、それだけで再帰呼び出し、終了に向けて再帰的なコードがこれまで近づけるようにする方法を、再帰呼び出しの時点で、特定の再帰的な輸出を理解するためには、呼び出す前に、

最終的に終了再帰を見つける。この問題は、半分の成功それを呼び出す再帰見たいです。

再帰的に呼び出す前にも、あなたは再帰の山で何かを呼び出す場合、最終的な分析では、再帰スタックによって算出され、新しいオブジェクトの外にあってはならない、ということを発見しました。

そして、再帰呼び出しは、リソース再帰呼び出しを減らすに外部のリソースの再帰的使用を呼び出すようにしようとするとき。

ここでは、繰り返し文の出力を書き込むための再帰的な方法は、単純な例で、コード自体は問題ありませんが、あまりにもコール数の方法ならば、まだエラースタックオーバーフローがスローされます。

コードは、直接文字列メソッドの再帰呼び出しを使用して、自分のコンピュータ上で、簡単な出力ステートメントを使用してテストされ、一回以上6200回は、例外をスローすることがあります

一度再帰的な方法でStringBuilderの呼び出し、12,000人以上が例外をスローすることがあります

今日は本当に古典の8再帰女王の教師の方法。リソース-ない多く、しかし先生は、実際には、このアルゴリズムは、おそらく複数の再帰的な方法は、14000を呼び出している、と述べました

したがって、実際には、再帰的なメソッドのコードリソースを使用して、コード自体の複雑さは、キーがどのようにコード設計を見るためにあまり問題ではありません、

どのようにも呼び出すときにあまりにも多くのコンピュータリソースを占有しないと約束することができます。

これらは、再帰のために自分自身のいくつかの表面的な理解です。

ここで私は、再帰的なコードを解決8つのクイーン問題を書き換え置きます。

1  パッケージcom.recursion;
 2  
。3  / * 
4  再帰後戻り解決* 8クイーン問題
 5  *需要は、チェスのルールによれば、8つのクイーンを基板上に配置され、各女王は次の移動サブ食べることができない
 6  *ボード上に配置されます8つのクイーン、正の溶液としてクイーン位置8は、正のソリューションの合計数を計算するとき
 7  * 
 8  *再帰後戻り考え
 9  *最初の行、最初の列、第2の放電女王の最初の女王子供が次の動きを食べることができるかどうかを確認するために、
 10は バック深夜、可能な位置の下に配置された第3の女王が、配置された*子供を食べることができない、変更する
 11  女王たときに第八に戻し*が解決開始
 12  *取得します正解は、スタックを返すようになり、スタックは、すべての可能性に、再びそれを試してみなければならない
 13の 最初の女王に帰り、再び解決スタック上の*リターン
 14  * 
 15   * / 
16  パブリック クラスEightQueen {
 17      // 1 8つのクイーンの合計
18     int型の最大値= 8 ;
 19      // 1は、アレイ定義保存液
20である     INT []配列= 新しい新しい INT [最大];
 21である     // 。5、変数溶液の定義
22は     静的 int型 COUNT = 0 ;
 23である     パブリック 静的 ボイドメイン(文字列[]引数){
 24          // TODO自動生成方法スタブ
 25          // 1は、一次元アレイ基板で表される、インデックスが行座標を表し、列は座標を表す値
 26          // 女王を定義する出力処理の位置に置く
 27          / / 4、再帰的に呼び出される試験方法
28          EightQueen queen8 = 新しい新しいEightQueen();
 29         queen8.check(0 );
 30          // 5、溶液何統計の合計。
31が          System.out.printf( "%D総種子溶液" 、COUNT);
 32      }
 33である     
34れる     // 。3、クイーン方法は、場所を定義しました各チェックは、正の既知のソリューションをもたらす、再帰ループに入る
35      プライベート ボイド検査(INT N-){
 36          // n型である8、正の溶液法、再帰出口
37 [          IF(N - == max)は{
 38である             (プリント);
 39              戻り;
 40          }
 41れる         // 配置女王は、衝突か否かを判断
42である         ためint型 I = 0;私はmaxに<; I ++は){
43              //が最初の行に入れ、Nクイーン
44が              配列[N] = I;
 45              IF (Nジャッジ()){
 46は                 // ない競合は、N + 1つのクイーンを置くようになった場合、再帰が開始
47                  N(チェック+ 1 );
 48              }
 49              // 競合は、再帰的なループが次の行に続く場合
50          }
 51      }
 52は、     
53である     // 2、n番目の場所クイーン方法満たす配置ルールの定義を参照
54      / ** 
55       * 
 56       * @param nはN-クイーン
 57がある      * @return 
58       * / 
59      プライベート ブール裁判官は、(int型N){
 60          のためにint型 I = 0; Iは、N <; Iは++ ){
 61である             // n番目とn-1クイーンクイーンは、同じ列にあるかどうかを判定し、Nインクリメント動作自体、必要としません行分析
 62              //はn番目とi番目クイーンクイーンは同じ斜線にある決定
63で             のiF(配列[I] ==配列[N] || Math.abs(N - I)Math.abs ==(配列[N-] - 配列[I])){
 64                  リターン falseに;
 65              } 
 66          }
 67          リターン trueに;
 68      }
 69      
70      // 1、メソッド定義プリントアウト
71である     プライベート ボイドプリント(){
 72         ++数えます73          のためには、int型 0 = Iと、iは<Array.lengthと; iは++ ){
 74              System.out.print(配列[I] + "" )。
75          }
 76          のSystem.out.println();
77      }
 78  
79 }

コードはあまりないですが、複雑な古典計算問題を解決します。

おすすめ

転載: www.cnblogs.com/zzzzzpaul/p/11588020.html