递归永远不会结束,即使返回语句

问题描述:

我可能不明白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); 
      } 
     } 
    } 
} 

基本上我试图做的是,用递归,找出0-5所有组合的10种不同的水果(这只是我学习,不homework..not学生)。

任何想法我做错了什么?为什么这个程序不能用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); 
      } 
     } 
    } 
} 
+0

线 对(INT I = 0; I> = list_to_start.size();我++){ 会导致异常时list_to_start.size()== 0 – 2012-04-04 03:37:24

+0

@RileyLark我不减少list_to_start只长度。目前我没有得到任何错误,它只是继续前进。 – 2012-04-04 03:40:42

+0

好的。您可能仍然会重新考虑这条线是否符合您的要求〜 – 2012-04-04 03:43:23

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

在每个级别循环5次,每次分支到另一个递归。你有10个级别,所以你最多可以在底层调用5^10个函数,或者调用9,765,625个System.out.println!

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

+0

奇怪。当我离开它时,它会持续5分钟(在我的MacBook Core Duo中),但是当我移除System.out.println(“List is空现在“);它立即结束,而不显示结果列表..我现在更加困惑。 – 2012-04-04 03:43:36

+1

它可能只是因为System.out.println需要很长时间才会重载输出缓冲区......您的代码将打印出“List is empty now”1000万次! – 2012-04-04 03:46:58

+0

我认为你的权利,没有意识到它需要这么长时间。阿米特的回答也很有帮助(你说得对,在我的if循环中,我的符号是错误的)。非常感谢大家! – 2012-04-04 03:48:32

你的病情for循环时长= 0应该是

i<list_to_start.size() 

和莱利说,你的递归需要有所微调。

+0

正如原帖所写,循环根本不执行 – 2012-04-04 03:48:13

+0

@RileyLark我的错误。我的意思是由递归引起的调用次数,而不是输入循环!谢谢。 – 2012-04-04 03:49:50