在Java中检索递归调用之间的值

时间:2011-04-23 01:34:53

标签: java recursion

我有一个递归代码,可以在每次调用时从集合中删除值。当它从调用返回到前一个递归时,我希望补充与进入调用之前完全相同的状态。因此,例如在下面的代码中:

// initial value of this list is [a,b,c]  
void foo(ArrayList<Character> myList)     
{  
  for(int i=0; i< size;i++)
  {
    myList.remove(i); // Now it becomes [b,c]  
    foo(myList);  
    /* QUESTION: at this point how do i retrieve the value [b,c] -- because it goes into successive recursive calls I'm unable to get this value back!!*/  
  }  
}

3 个答案:

答案 0 :(得分:0)

在递归调用中将myList副本传递给foo:

// initial value of this list is [a,b,c]  
@SuppressWarnings("unchecked")
static void foo(ArrayList<Character> myList)     
{  
  for(int i=0; i< myList.size();i++)
  {
    myList.remove(i); // Now it becomes [b,c]  
    foo((ArrayList<Character>)myList.clone());
  }  
}

答案 1 :(得分:0)

一般情况下,你没有。

要保留在递归调用之前需要复制它的内容:

void foo(ArrayList<Character> myList)     
{  
  for(int i=0; i< size;i++)
  {
    myList.remove(i); // Now it becomes [b,c]  
    ArrayList<Character> lastList = new ArrayList<Character>(myList);
    foo(myList);  
    /* QUESTION: at this point how do i retrieve the value [b,c] -- because it goes into successive recursive calls I'm unable to get this value back!!*/
    // Answer: you now have a copy of the list prior to the recursive call in lastList  
  }  
}

答案 2 :(得分:0)

这就是我递归的方式:

void foo(List<Character> list){
   if(list.size()>0){ //recursion condition
     list.remove(0);
     foo(list);
   }
}

但您似乎有兴趣在任何递归之前访问原始列表。因此,您将被迫保持原始参数列表不变,并将其原样传递给每个递归以及包含计算进度或处理原始输入的另一个列表。

List<Character> foo(List<Character> source, List<Character> result){
  if(result == null){ // only on first call
     result = new ArrayList<Character>(source); //accumulator copy
  }

  //here you could do any comparisons you want
  
  if(!result.isEmpty()){ //recursion condition
    result.remove(0);
    return foo(source, result);
   }
   return result;
}

这就是我使用它的方式

List<Character> letters = Arrays.asList('a', 'b', 'c');
List<Character> result = foo(letters, null);

如果我们按照原始示例,我假设结果将始终为空列表。我用纸做了所有这些,所以我没有在代码中测试它。我希望这个想法足够清楚。