为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_花开花谢_0 2022-11-02 10:01:48
我尝试在 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()将其附加到末尾)


查看完整回答
反对 回复 2022-11-02
?
胡子哥哥

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 第一个元素移动到数组的末尾


查看完整回答
反对 回复 2022-11-02
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

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



查看完整回答
反对 回复 2022-11-02
?
桃花长相依

TA贡献1860条经验 获得超8个赞

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



查看完整回答
反对 回复 2022-11-02
?
守着一只汪

TA贡献1872条经验 获得超3个赞

原始列表值:

01234

当 n =2 列表修改为

12340

当 n=1 列表修改为

23401

当 n 达到 0 时,递归将停止。并且列表中的项目当前顺序将是

23401


查看完整回答
反对 回复 2022-11-02
  • 5 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信