我尝试在 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 如何到达列表的末尾?
5 回答
米脂
TA贡献1836条经验 获得超3个赞
在您的代码中执行myFun({0,1,2,3,4},2);
.
这执行myFun({1,2,3,4,0},1);
.
下一个执行的 myFun 是myFun({2,3,4,0,1},0);
,它立即停止。
这是因为您删除了第一个元素并将其添加到末尾(add()
将其附加到末尾)
胡子哥哥
TA贡献1825条经验 获得超6个赞
出色地
A x = xs.get(0);
xs.remove(0);
xs.add(x);
将第一个元素移动到最后一个位置
if (n > 0) {
尽管n is > 0
你从
myFun(xs,2);
并由于以下原因递归调用 N 次myFun(xs,n-1);
所以你将 2 第一个元素移动到数组的末尾
米琪卡哇伊
TA贡献1998条经验 获得超6个赞
函数“myFun”从列表中删除 n 个元素,然后将它们再次添加到列表中。add 方法将元素添加到列表的末尾。因为您发送了 n=2 。myFun 将从列表的“头”中删除 0,1,然后移动到列表的末尾。
桃花长相依
TA贡献1860条经验 获得超8个赞
因为您已将n设置为 2。所以基本上 myFun() 最多会执行两次。myFun() 正在删除列表的第一个元素并将其重新添加到后面。由于这只能发生两次,因此前两个元素(0 和 1)将被发送到列表的后面。
守着一只汪
TA贡献1872条经验 获得超3个赞
原始列表值:
01234
当 n =2 列表修改为
12340
当 n=1 列表修改为
23401
当 n 达到 0 时,递归将停止。并且列表中的项目当前顺序将是
23401
添加回答
举报
0/150
提交
取消