我已经尝试在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如何到达列表的末尾?
答案 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);
因此您将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。