递归和通过引用传递的参数

Recursion and parameters passed by reference

有人可以用非常简单的术语解释为什么下面的代码输出 35 而不是 999 当数组本质上是通过引用传递并且 temp[0] 是 999 并作为 num1 传递到 someFunction() 时。

public class 测试B {

public static void main(String[] args)
{
    int[] num1 = {35};
    someFunction(num1, 3);     
    System.out.println(num1[0]);  //prints 35
}

public static void someFunction(int[] num1, int count){

    if (count!= 0){
        int[] temp = {999};
        someFunction(temp, count-1);
    }
}

}

someFunction 不读取或写入 num1 参数。因此,根据定义 someFunction 不能影响从 main.

传入的 num1 数组

无论您选择的语言中的数组参数是按引用还是按值传递,情况都会如此。

As I trace through the algorithm, on the second call, num1[0] is 999 and continues to be until I return back to main.

我怀疑您对 main 中的变量名和 someFunction 中的参数名相同这一事实感到困惑。您看到 num1 设置为特定值 - 但那不是 mainnum1 - 那是 someFunctionnum1。为了在调试时更清楚,将其中之一的名称(main 中的变量名称或 someFunction 中的参数名称)更改为 bob

就你试图达到的结果而言,我怀疑,也许不是:

public static void someFunction(int[] num1, int count){

    if (count!= 0){
        int[] temp = {999};
        someFunction(temp, count-1);
    }
}

你可能想写:

public static void someFunction(int[] num1, int count){

    if (count!= 0){
        num1[0] = 999;
        someFunction(num1, count-1);
    }
}

请特别注意(根据我的建议更改)someFunction 将写入 num1 参数(传入的参数,而不是新的 temp 数组)- 所以main 中的数组将反映该更改。