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 语句退出了当前的函数调用……但是你这里有超过 1000 万个函数调用,所以它必须返回很多次。

于 2012-04-04T03:40:13.997 回答
3

当 length = 0 时,您在 for 循环中的条件应该是

i<list_to_start.size()

正如莱利所说,您的递归需要进行一些调整。

于 2012-04-04T03:42:27.737 回答