Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList与Array递归的区别_Java_Arrays_Recursion_Arraylist - Fatal编程技术网

Java ArrayList与Array递归的区别

Java ArrayList与Array递归的区别,java,arrays,recursion,arraylist,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.

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

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();
    }
现在,以这个简单的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]*/
问题:
递归堆栈
的内存实现中,
数组
输出是我正确理解的,上一个或下一个堆栈的值比上一个堆栈的值小一个,作为
i
增量,但使用相同的实现,为什么
ArrayList
的所有堆栈都包含本应仅在递归堆栈的
top
中的值


ArrayList
的情况下,递归是如何实现的?

您只是告诉System.out打印ArrayList的toString方法,它总是打印其所有内容。您需要像在第一个示例中那样添加一个循环

for(int k=0;k<i;k++)
    System.out.print(a.get(k)+" ");

for(int k=0;k您只是告诉System.out打印ArrayList的toString方法,它总是打印它的所有内容。您需要像第一个示例中那样添加一个循环

for(int k=0;k<i;k++)
    System.out.print(a.get(k)+" ");

for(int k=0;k您的代码首先分别用值填充数组
ArrayList
,然后打印内容

唯一的区别是,在ArrayList中打印整个列表,而在ArrayList中只打印元素0到i

由于
i
是一个基本值,
printArray()
的每次调用都有自己的版本

但是对象,如
ArrayList
的实例,作为引用传递。因此,每次调用printArray()都在同一
ArrayList
上工作,而不是在原始实例的副本上工作。这就是为什么所有调用
printArray()
在使用ArrayList时打印相同结果的原因


下面是一个教程,它描述了基本类型和对象之间的区别:

您的代码首先分别用值填充数组
ArrayList
,然后打印内容

唯一的区别是,在ArrayList中打印整个列表,而在ArrayList中只打印元素0到i

由于
i
是一个基本值,
printArray()
的每次调用都有自己的版本

但是对象,如
ArrayList
的实例,作为引用传递。因此,每次调用printArray()都在同一
ArrayList
上工作,而不是在原始实例的副本上工作。这就是为什么所有调用
printArray()
在使用ArrayList时打印相同结果的原因


这里有一个教程描述了基本类型和对象之间的区别:

您在执行递归后打印结果,这意味着,您的递归是非最终的(有关尾部递归的更多信息)因此,在这两种情况下,结果都是完整的数组/列表,第一个版本的不同之处在于,
i
变量范围是函数本身,它不会在递归调用中修改,因此当您迭代打印结果时,您只会检查N个第一个值,但如果您调试并查看数组,您将看到这是完整的a雷

数组和arraylist之间的递归没有区别,代码的主要区别在于显示结果的方式

您的尾部递归代码:

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

    }
静态void打印数组(ArrayList a,int n)
{
如果(++n>5)
返回;
a、 添加(n);
System.out.println(“数组列表的大小为”+a.Size());
System.out.println(“数组列表的内容为“+a+”\n\n”);
打印阵列(a,n);
}
静态无效打印阵列1(int[]a,int i)
{
如果(i>5)
返回;
a[++i]=i;
System.out.println(“数组大小为”+a.length);

对于(int k=0;k您在执行递归后打印结果,这意味着您的递归是非最终的(关于尾部递归的更多信息)因此,在这两种情况下,结果都是完整的数组/列表,第一个版本的不同之处在于,
i
变量范围是函数本身,它不会在递归调用中修改,因此当您迭代打印结果时,您只会检查N个第一个值,但如果您调试并查看数组,您将看到这是完整的a雷

数组和arraylist之间的递归没有区别,代码的主要区别在于显示结果的方式

您的尾部递归代码:

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

    }
静态void打印数组(ArrayList a,int n)
{
如果(++n>5)
返回;
a、 添加(n);
System.out.println(“数组列表的大小为”+a.Size());
System.out.println(“数组列表的内容为“+a+”\n\n”);
打印阵列(a,n);
}
静态无效打印阵列1(int[]a,int i)
{
如果(i>5)
返回;
a[++i]=i;
System.out.println(“数组大小为”+a.length);

对于(int k=0;kWhat您不在其中……。在第一个例子中,您使用了基于i的循环,因为i的值在不同的函数cal(1,2,3,4,5)中不同这就是为什么每个函数调用都会得到不同的输出,但是在arraylist实现中,您只是打印所有元素,这样就可以得到整个arraylist。在
arraylist
中,当递归列表返回到第二个堆栈中时……然后在第二个堆栈中,元素
5
没有填充进去……那么如何打印呢???什么在第一个例子中,你使用了基于i的循环,因为i的值在不同的函数cal(1,2,3,4,5)中是不同的这就是为什么每个函数调用都会得到不同的输出,但在arraylist实现中,您只是打印all元素,这样就可以得到整个arraylist。在
arraylist
中,当递归列表返回到第二个堆栈时……然后在第二个堆栈中,元素
5
没有填充