1

returnステートメントが何をするのか理解できないかもしれません(変数を返し、ループを終了できると思っていました)。私は再帰をよりよく理解しようとしていますが、これは決して終了しないようです。

import java.util.Arrays;
import java.util.List;

public class main {

    public static void main(String[] args) {
        System.out.println("Starting..");
        List<Integer> list_to_start = Arrays.asList(new Integer[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); 
        String[] name_of_list_to_start = new String[] {"grapes", "Strawberries", "Raspberries", "Blackberries", "Pineapples", "Oranges", "Prunes", "Pears", "cherries", "Peaches", "Apples"};       
        System.out.println(list_to_start.size());
        counter(list_to_start.size(), list_to_start, name_of_list_to_start);
    }

    private static void counter(int length, List<Integer> list_to_start, String[] name_of_list_to_start) {
        // TODO Auto-generated method stub
        if (length == 0) {
            System.out.println("List is empty now");
            for (int i = 0; i>=list_to_start.size(); i++) {
                System.out.println(name_of_list_to_start[i] + " = " + list_to_start.get(i));
            }
            return;
        }   
        Integer x_lenght = (Integer) list_to_start.get(length-1);
        for (int i = 0; i<=5; i++) {
            //System.out.println(i);
            if (length != 0 ) {
                list_to_start.set((length-1), i);
                counter((length-1), list_to_start, name_of_list_to_start);
                list_to_start.set((length-1), 0);
            }
        }
    }
}

基本的に私がやろうとしているのは、再帰を使用して、10種類の果物の0〜5のすべての組み合わせを把握することです(これは私が学ぶためのものであり、宿題ではありません。学生ではありません)。

私が間違っていることについて何か考えはありますか?このプログラムがreturnステートメントで停止しないのはなぜですか?

更新:誰かが同じ問題を抱えている場合に備えて、上記のコードの動作バージョンを次に示します(答えが意味をなすように壊れたコードを保持します):

import java.util.Arrays;
import java.util.List;

public class main {

    public static void main(String[] args) {
        System.out.println("Starting..");
        List<Integer> list_to_start = Arrays.asList(new Integer[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); 
        String[] name_of_list_to_start = new String[] {"grapes", "Strawberries", "Raspberries", "Blackberries", "Pineapples", "Oranges", "Prunes", "Pears", "cherries", "Peaches", "Apples"};       
        System.out.println(list_to_start.size());
        counter(list_to_start.size(), list_to_start, name_of_list_to_start);
    }

    private static void counter(int length, List<Integer> list_to_start, String[] name_of_list_to_start) {
        // TODO Auto-generated method stub
        if (length == 0) {
            //System.out.println("List is empty now");
            for (int i = 0; i<list_to_start.size(); i++) {
                //(name_of_list_to_start[i] + " = " + list_to_start.get(i));
                int k = i +2;
                int y = k -1;
            }
            //System.out.println("********");
            return;
        }   
        Integer x_lenght = (Integer) list_to_start.get(length-1);
        for (int i = 0; i<=5; i++) {
            //System.out.println(i);
            if (length != 0 ) {
                list_to_start.set((length-1), i);
                counter((length-1), list_to_start, name_of_list_to_start);
                list_to_start.set((length-1), 0);
            }
        }
    }
}
4

2 に答える 2

3

これは本当に長いシーケンスではなく、無限ループですか?

各レベルで 5 回ループし、毎回別の再帰に分岐します。10 レベルあるので、最下位レベルで合計 5^10 の関数呼び出し、つまり 9,765,625 回の System.out.println 呼び出しが発生します。

return ステートメントがループしていません。return ステートメントは現在の関数呼び出しを終了します... しかし、ここには 1,000 万を超える関数呼び出しがあるため、何度も戻る必要があります。

于 2012-04-04T03:40:13.997 に答える
3

長さ = 0 の場合の for ループの条件は、

i<list_to_start.size()

ライリーが言ったように、再帰は多少調整する必要があります。

于 2012-04-04T03:42:27.737 に答える