提问人:Tortoise 提问时间:6/30/2019 最后编辑:mjwillsTortoise 更新时间:6/30/2019 访问量:45
递归和引用传递的参数
Recursion and parameters passed by reference
问:
有人可以用非常简单的术语解释为什么下面的代码输出 35 而不是 999,而数组本质上是通过引用传递的,而 temp[0] 是 999 并作为 num1 传递给 someFunction()。
公共类 TestB {
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);
}
}
}
答:
1赞
mjwills
6/30/2019
#1
someFunction
不读取或写入参数。因此,根据定义,不能影响从 传入的数组。num1
someFunction
num1
main
无论您选择的语言中的数组参数是通过引用还是按值传递,情况都是如此。
当我通过算法进行跟踪时,在第二次调用时,num1[0] 是 999 并一直持续到我回到主线。
我怀疑您对变量名称 in 和参数名称相同的事实感到困惑。您看到的是设置为特定值 - 但这不是 的 - 那是 的 。若要在调试时更清楚地说明这一点,请将其中一个的名称(变量名称 in 或参数名称 )改为 。main
someFunction
num1
main
num1
someFunction
num1
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
评论
0赞
Tortoise
6/30/2019
我明白你在说什么。您能简单地解释为什么当您跟踪呼叫 num1[0] 时会变成 999 吗?参数是否是每个调用的本地参数?
0赞
mjwills
6/30/2019
是 的 .将其中一个 s 的名称更改为 ,您将很快发现您的错误。num1
someFunction
num1
num1
bob
1赞
Tortoise
6/30/2019
啊,抱歉,我想你在上面回答了这一点。谢谢!
评论
temp
temp[0]
num1
someFunction
someFunctions