การเรียกซ้ำไม่ทำงาน

ฉันต้องการสร้างอาร์เรย์ด้วยตัวเลข 0-6 โดยที่ตัวเลขมีการกระจายเท่าๆ กัน เพื่อค้นหาวิธีแก้ปัญหาที่เป็นไปได้ทั้งหมด ฉันต้องการใช้ Recursion เพื่อวางตัวเลขที่สามารถวางไว้ตรงนั้นและไปยังตำแหน่งถัดไป แต่เมื่อฉันรันมันด้วย Eclipse มันจะผ่านไปหนึ่งครั้งแล้วกลับไปที่การโทรครั้งแรกและดำเนินการต่อด้วย for-loop แต่ไม่มีการเรียกเมธอดอีกครั้ง

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);
            }
        }
    }
}

person Tloy    schedule 10.07.2017    source แหล่งที่มา
comment
คุณได้ก้าวผ่านโค้ดในดีบักเกอร์แล้วหรือยัง? หากเป็นเช่นนั้น คุณพบจุดที่คุณ คาดหวัง ว่ามันจะเกิดซ้ำ แต่ไม่พบหรือไม่   -  person Jon Skeet    schedule 10.07.2017
comment
ไม่ใช่ว่าคนที่นี่ใจร้าย แต่ส่วนใหญ่แล้วการเรียกใช้โปรแกรมดีบักเกอร์จะใช้เวลาในการเรียนรู้น้อยกว่าการโพสต์ การจัดรูปแบบ และรอคำตอบ และคุณมีประโยชน์ในการหลีกเลี่ยงคำตอบ/ความคิดเห็นที่บ้าๆบอ ๆ   -  person efekctive    schedule 10.07.2017
comment
ตกลง. ฉันเสียใจ. ฉันไม่เคยใช้ดีบักเกอร์เลย แต่การใช้มันเผยให้เห็นว่าอาร์เรย์ f และ d ไม่อยู่ในสถานะที่ควรจะเป็นในขณะที่กำลังลงไปที่ call stack ฉันลืมลบมูลค่าเพิ่มบน d อีกครั้ง ตอนนี้มันทำงานได้อย่างถูกต้อง แต่สิ่งที่ฉันไม่ได้รับก็คือดีบักเกอร์แสดง f พร้อมตัวเลขที่ฉันกำหนดให้กับมันขึ้นไปบน call stack แต่ไม่ควรไม่มีอะไรเลย เนื่องจากใน java คุณส่งสำเนาเป็นพารามิเตอร์ไปยังเมธอดหรือฉันผิด ?   -  person Tloy    schedule 10.07.2017


คำตอบ (1)


การเรียกซ้ำกำลังทำงาน:

ป้อนคำอธิบายรูปภาพที่นี่

อัลกอริทึมของคุณอาจไม่เป็นเช่นนั้น ฉันไม่ชัดเจนว่าคุณกำลังพยายามทำอะไรให้สำเร็จ

person Daniel A. Thompson    schedule 10.07.2017