Java 即使使用return语句,递归也永远不会结束
我可能不理解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
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我的错误。我的意思是由于递归而产生的调用数,但是输入了循环!谢谢。