递归填充简单数组,然后打印所有内容:
void printArray(int[] a,int i)
{
if(i > 5)
return;
a[++i] = i;
printArray(a,i);
System.out.println("array size is "+a.length);
for(int k=0;k<i;k++)
System.out.print(a[k]+" ");
System.out.println();
}
输出(数组大小在main
中定义)
array size is 6
0 1 2 3 4
array size is 6
0 1 2 3
array size is 6
0 1 2
array size is 6
0 1
array size is 6
0
现在,请使用这个简单的ArrayList片段:
void printArray(ArrayList a, int n)
{
if(++n > 5)
return;
a.add(n);
printArray(a,n);
System.out.println("Size of array list is "+a.size());
System.out.println("Content of Array list are "+a+"\n\n");
}
输出
Size of array list is 6
Content of Array list are [0, 1, 2, 3, 4, 5] /*this is fine */
Size of array list is 6
Content of Array list are [0, 1, 2, 3, 4, 5] /*should have been [0, 1, 2, 3, 4]*/
Size of array list is 6
Content of Array list are [0, 1, 2, 3, 4, 5]/*should have been [0, 1, 2, 3]*/
Size of array list is 6
Content of Array list are [0, 1, 2, 3, 4, 5]/*should have been [0, 1, 2]*/
Size of array list is 6
Content of Array list are [0, 1, 2, 3, 4, 5]/*should have been [0, 1]*/
Size of array list is 6
Content of Array list are [0, 1, 2, 3, 4, 5]/*should have been [0]*/
问题:在Recursion stack
的内存实施中,array
输出正是我所理解的,上一个或下面的 堆栈保持值比其上方的堆栈少一个i
递增但使用相同的实现,为什么ArrayList
的所有堆栈都包含应该仅在递归堆栈的top
中的值???
如果ArrayList
???
答案 0 :(得分:2)
您的代码首先使用值分别填充数组ArrayList
,然后打印内容。
唯一的区别是,在ArrayList的情况下,您打印整个列表,而在Array的情况下,您只打印元素 0 到 i 。
由于i
是原始值,因此printArray()
的每个调用都有自己的版本。
但是像ArrayList
的实例一样,对象作为参考传递。因此,printArray()的每次调用都在同一个ArrayList
上进行,而不是在原始实例的副本上进行。这就是为什么printArray()
的所有调用在使用ArrayList时打印相同结果的原因。
这是一个描述基元类型和对象之间差异的教程:http://www.javawithus.com/tutorial/call-by-value-and-call-by-reference
答案 1 :(得分:1)
您只是告诉System.out打印ArrayList的toString方法,该方法始终打印其所有内容。您需要在第一个示例中添加一个循环。
for(int k=0;k<i;k++)
System.out.print(a.get(k)+" ");
然后他们会做同样的事情。
答案 2 :(得分:1)
你在递归执行后打印结果,这意味着你的递归是非最终的(关于尾递归的更多信息here)所以在这两种情况下结果都是完整的数组/列表,您的第一个版本的差异在于您的i
变量范围是函数本身,它在递归调用中没有被修改,因此当您迭代打印结果时,您只检查N个第一个值,但是如果您调试并查看在数组中,您将看到完整的数组。
数组和arraylist之间的递归没有区别,代码的主要区别在于显示结果的方式。
你的Tail递归代码:
static void printArray(ArrayList a, int n)
{
if(++n > 5)
return;
a.add(n);
System.out.println("Size of array list is "+a.size());
System.out.println("Content of Array list are "+a+"\n\n");
printArray(a,n);
}
static void printArray1(int[] a,int i)
{
if(i > 5)
return;
a[++i] = i;
System.out.println("array size is "+a.length);
for(int k=0;k<i;k++)
System.out.print(a[k]+" ");
System.out.println();
printArray1(a,i);
}