2017-07-10 13 views
0

数字が0から6の配列を作成したいと思います。すべての可能な解決策を見つけるために、私は再帰を使用してそこに配置し、次の位置に移動できる数字を配置したいと考えました。しかし、私はEclipseでそれを実行します。これは一度行ってから最初の呼び出しに戻り、forループを続行しますが、メソッドを再度呼び出すことはありません。再帰が機能しない

import java.util.LinkedList; 

public class Search { 
int WIDTH = 8; 
int HEIGHT = 7; 

boolean hasDistroStopped = false; 
boolean hasSolveStopped = false; 
boolean hasUniqueStopped = false; 

public LinkedList<String> fDistro = new LinkedList<String>(); 
//public LinkedList<String> fSolve = new LinkedList<String>(); 
//public LinkedList<String> fUnique = new LinkedList<String>(); 

public static void main(String[] args){ 
    Search a = new Search(); 

    FindDistro findDistro = a.new FindDistro(); 
    //FindSolve findSolve = a.new FindSolve(); 
    //FindUnique findUnique = a.new FindUnique(); 

    findDistro.start(); 
    //findSolve.start(); 
    //findUnique.start(); 
} 

public class FindDistro extends Thread{ 
    long start; 
    int[] field = new int[WIDTH*HEIGHT]; 
    int[] distro = {0,0,0,0,0,0,0}; 

    public FindDistro(){} 

    public void run(){ 
     start = System.currentTimeMillis(); 

     findFieldsRecursive(field,distro,0); 

     synchronized(fDistro){ 
      System.out.println("Found " + fDistro.size() + " fields in " + ((System.currentTimeMillis() - start)/1000) + "s."); 
      hasDistroStopped = true; 
     } 
    } 
    /** 
    * This method evenly populates recursively the field with numbers and allows every field to be 
    * found without the danger of invalid ones. 
    * @param f The current field 
    * @param d The current distribution of numbers 
    * @param pos The current position in the field. Has to be zero to start the recursion properly. 
    */ 
    public void findFieldsRecursive(int[] f, int[] d, int pos){ 
     // Test if we finished the field 
     if (pos == f.length){ 
      String a = ""; 
      for (int i = 0; i < f.length; i++){ 
       a += Integer.toString(f[i]); 
      } 
      synchronized(fDistro){ 
       fDistro.add(a); 
      } 
      return; 
     } 

     //Test for the numbers 
     for(int i = 0; i < HEIGHT; i++){ 
      if(d[i] != WIDTH){ 
       f[i] = i; 
       d[i]++; 
       findFieldsRecursive(f,d,pos + 1); 
      } 
     } 
    } 
} 
+7

デバッガでコードをステップ実行しましたか?もしそうなら、あなたは*再発すると期待していた場所を見つけましたか? –

+0

ここにいる人は意味がありませんが、デバッガを実行するほとんどの時間は、投稿、書式設定、および回答を待つことよりも、学ぶ時間がかかりません。そして、あなたは不気味な答え/コメントを避ける利点があります。 – efekctive

+0

ごめんなさい。私は実際にデバッガを実際に使ったことはありません。しかし、それを使用して、配列fとdは呼び出しスタックを下っている間、想定された状態に留まらないことが明らかになりました。私はdに追加された値をもう一度削除するのを忘れてしまった。今それは適切に動作します。しかし、私が得ないのは、デバッガが私に呼び出しスタックの上にそれ以上割り当てた番号のfを表示するということですが、javaではメソッドのパラメータとしてコピーを渡すか、間違っているので何もしてはいけません? – Tloy

答えて

0

再帰が働いている:

enter image description here

あなたのアルゴリズムはいえないかもしれません。あなたが達成しようとしていることは私には分かりません。

関連する問題