这个递归代码如何改变我的列表?

我尝试在 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 如何到达列表的末尾?


qq_花开花谢_0
浏览 114回答 5
5回答

米脂

在您的代码中执行myFun({0,1,2,3,4},2);.这执行myFun({1,2,3,4,0},1);.下一个执行的 myFun 是myFun({2,3,4,0,1},0);,它立即停止。这是因为您删除了第一个元素并将其添加到末尾(add()将其附加到末尾)

胡子哥哥

出色地A x = xs.get(0);&nbsp;&nbsp;xs.remove(0);&nbsp;xs.add(x);&nbsp;将第一个元素移动到最后一个位置if (n > 0) {&nbsp;&nbsp;尽管n is > 0你从myFun(xs,2);并由于以下原因递归调用 N 次myFun(xs,n-1);所以你将 2 第一个元素移动到数组的末尾

米琪卡哇伊

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

桃花长相依

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

守着一只汪

原始列表值:01234当 n =2 列表修改为12340当 n=1 列表修改为23401当 n 达到 0 时,递归将停止。并且列表中的项目当前顺序将是23401
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java