2017-07-10 43 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上的附加值。現在它工作正常。但是我沒有得到的是調試器給我顯示了我分配給它的數字,這些數字進一步分配給調用堆棧,但是應該沒有任何內容,因爲在java中你將一個副本作爲參數傳遞給一個方法,或者我錯了? – Tloy

回答

0

遞歸工作:

enter image description here

你的算法可能不是,但。我不清楚你想要完成什麼。