此递归代码如何更改我的列表?

时间:2019-04-30 11:16:12

标签: java recursion

我已经尝试在IntellIj中运行和调试以下代码,以便跟踪我的代码的每一行做什么,但是我仍然不了解结果。

public static void testMyFun() {  

  List<Integer> xs = new ArrayList<Integer>(); 

  for (int i = 0; i < 5; i++) 
    xs.add(i);  

  myFun(xs,2);

  System.out.println(xs);  
}   


public static <A> void myFun (List<A> xs, int n) {  
  if (n > 0) {   

    A x = xs.get(0);  

    xs.remove(0); 

    xs.add(x); 

    myFun(xs, n-1);    
} 

我得到的结果是[2,3,4,0,1] 0和1如何到达列表的末尾?

6 个答案:

答案 0 :(得分:0)

因为您将 n 设置为2,所以本质上myFun()最多将执行两次。 myFun()正在删除列表的第一个元素,并将其重新添加到后面。由于只能发生两次,因此前两个元素(0和1)将发送到列表的后面。

答案 1 :(得分:0)

在您的代码中执行myFun({0,1,2,3,4},2);

这将执行myFun({1,2,3,4,0},1);

下一个执行的myFun是myFun({2,3,4,0,1},0);,它会立即停止。

这是因为您删除了第一个元素并将其添加到末尾(add()会在末尾添加

答案 2 :(得分:0)

好吧

A x = xs.get(0);  

xs.remove(0); 

xs.add(x); 

将第一个元素移到最后一个位置

if (n > 0) {  

n is > 0

期间

开始
myFun(xs,2);

并由于myFun(xs,n-1);

重复调用N次

因此您将2个第一个元素移到数组的末尾

答案 3 :(得分:0)

函数“ myFun”从列表中删除n个元素,然后将它们再次添加到列表中。 add方法将元素添加到列表的末尾。 因为您发送了n = 2。 myFun将从列表的“ head”中删除0.1,然后移至列表的末尾。

答案 4 :(得分:0)

原始列表值:

12340

当n = 2列表修改为

23401

当n = 1个列表修改为

23401

当n达到0时,递归将停止。 列表中当前订单的商品将是

Wordnet

答案 5 :(得分:-1)

那很简单。 递归函数将运行两次,分别为n = 2和n = 1,如果子句不运行并且myFun将完成,则为0。