1

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

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[] 数组的行为与此不同。它保留了从 unwound call 中对其所做的所有更改。这在这里不会造成问题,因为它会在下次进入循环时更新。但是,我很好奇为什么原语和数组在 Java 中的行为不同。此外,这种行为是否可以在 C 中预期,C++ 和 C# 也一样?请注意,如果 N 是某个数组的一部分而不是独立的原始参数,则此函数将不起作用。

4

1 回答 1

1

那就是Java的参数传递机制。看看这个问题

于 2013-08-28T03:49:37.230 回答