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
没有填充