有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我今天注意到,在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[]数组的行为与此不同。它保留从解除调用对其所做的所有更改。这在这里不构成问题,因为它在下次进入循环时会更新。然而,我很好奇为什么原语和数组在Java中的行为不同。同样,这种行为在C、C++和C中也能被期待吗?请注意,如果N是某个数组的一部分,而不是独立的原语参数,则此函数将不起作用


共 (1) 个答案

  1. # 1 楼答案

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