ArrayList和Array的递归差异

时间:2014-03-25 15:40:06

标签: java arrays recursion arraylist

递归填充简单数组,然后打印所有内容:

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 ???

,如何实现递归

3 个答案:

答案 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);

    }