gpt4 book ai didi

java - 展开递归对不同类型变量的影响

转载 作者:太空宇宙 更新时间:2023-11-04 07:26:16 30 4
gpt4 key购买 nike

我今天注意到,在 Java 中,当数组和基元是递归函数的一部分时,它们的行为有所不同。例如,考虑以下递归代码,用于查找整数 (N) 可以用数组 (decom[]) 给定的不同面额硬币表示的方式数:

public static void printAll(int ind, int[] denom,int N,int[] vals){
if(N==0){
System.out.println(Arrays.toString(vals));
return;
}
if(ind == (denom.length))return;
int currdenom = denom[ind];
for(int i=0;i<=(N/currdenom);i++){
vals[ind] = i;
printAll(ind+1,denom,N-i*currdenom,vals);
}
}

很明显,当函数调用自身时,它会携带变量 vars (即存储每个面额的实际数字)和 N 到下一次调用中,因此它们保持不变。然而,当递归展开时(完成一个函数调用,程序返回到最后一个函数),它就会变得有趣。现在,N 的值立即重置为刚刚进行的调用时的值。这是幸运的,因为该函数依赖于该行为。然而,vals[] 数组的行为与此不同。它保留了取消调用时对其所做的所有更改。这在这里不会造成问题,因为它会在下次进入循环时更新。然而,我很好奇为什么原语和数组在 Java 中表现不同。另外,C、C++ 和 C# 中也可以出现这种行为吗?请注意,如果 N 是某个数组的一部分而不是独立的原始参数,则此函数将不起作用。

最佳答案

这就是Java的参数传递机制。看看这个question

关于java - 展开递归对不同类型变量的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18478964/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com