Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即使使用return语句,递归也永远不会结束_Java_Recursion - Fatal编程技术网

Java 即使使用return语句,递归也永远不会结束

Java 即使使用return语句,递归也永远不会结束,java,recursion,Java,Recursion,我可能不理解return语句的作用,我认为它只是返回了一个变量,并允许我退出循环。我试图更好地理解递归,但这似乎永远不会存在 import java.util.Arrays; import java.util.List; public class main { public static void main(String[] args) { System.out.println("Starting.."); List<Integer> li

我可能不理解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);
            }
        }
    }
}

你确定这是一个无限循环,而不仅仅是一个很长的序列吗

在每个级别上循环5次,每次分支到另一个递归。您有10个级别,因此在底层总共有5^10个函数调用,即9765625 System.out.println调用


您的return语句不在循环中。return语句退出当前函数调用。。。但是这里有1000多万个函数调用,所以它必须返回很多次。

你确定这是一个无限循环,而不仅仅是一个很长的序列吗

在每个级别上循环5次,每次分支到另一个递归。您有10个级别,因此在底层总共有5^10个函数调用,即9765625 System.out.println调用


您的return语句不在循环中。return语句退出当前函数调用。。。但是这里有1000多万个函数调用,因此它必须返回很多次。

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

i<list_to_start.size()

正如Riley所说,您的递归需要做一些调整。

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

i<list_to_start.size()


正如Riley所说,递归需要做一些调整。

int i=0的行;i> =列表到起始大小;i++{在列表_to_start.size==0@RileyLark我没有将列表长度缩减为仅开始长度。目前我没有收到任何错误,它只是一直在运行..好的。您可能仍然会重新考虑该行是否符合您的要求~ int I=0;I>=list\u到开始大小;I++{当list_to_start.size==0@RileyLark我并没有把列表长度减少到只开始的长度。目前我没有收到任何错误,它只是一直在运行。好吧。你可能仍然会重新考虑这行代码是否符合你的要求~奇怪..当我让它运行时,它在我的macbook core duo上运行了超过5分钟,但当我删除System.out.printlnList现在是空的;它立即结束,而不显示结果列表。我现在更困惑了。可能是System.out.println花费的时间太长,导致输出缓冲区过载…您的代码将打印列表现在是空的1000万次!我想您的权利,没有意识到这将花费这么长时间g、 Amit的回答也很有帮助。你是对的,我的if-for循环中的符号用错了。非常感谢大家!如果你能使用NetBeans等可视化调试器逐步检查代码,这种问题会更容易找到。奇怪。当我让它运行时,在我的macbook core duo上会持续5分钟以上,但当我删除它时e System.out.printlnList现在是空的;它立即结束而不显示结果列表。我现在更困惑了。可能是System.out.println花费了太长的时间,导致输出缓冲区过载…您的代码将打印列表现在是空的1000万次!我想您的权利,没有意识到这将花费这么长的时间。Amit's答案也很有帮助。你是对的,我在if-for循环中的符号是错误的。非常感谢大家!如果你可以使用可视化调试器(如NetBeans)逐步处理代码,这种类型的问题会更容易找到。正如在原始帖子中所写的,循环不会在任何时候执行all@RileyLark我错了,我是说c的数字所有这些都是由于递归,但是类型化的循环代替了!谢谢。正如在原始文章中所写的,循环不会在all@RileyLark我的错误。我的意思是由于递归而产生的调用数,但是输入了循环!谢谢。