Рекурсия и параметры, переданные по ссылке - PullRequest
0 голосов
/ 30 июня 2019

Может ли кто-нибудь объяснить в очень простых терминах, почему приведенный ниже код выводит 35, а не 999, когда массив по существу передается по ссылке, а temp [0] равен 999 и передается в someFunction () как num1.

открытый класс 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 Ответ

1 голос
/ 30 июня 2019

someFunction не читает и не записывает в параметр num1.Таким образом, someFunction по определению не может повлиять на массив num1, переданный ему из main.

Это будет иметь место, независимо от того, есть ли параметры массива в вашемвыбранный язык передавался по ссылке или по значению.

Когда я отслеживаю алгоритм, при втором вызове num1 [0] равен 999 и будет оставаться до тех пор, пока я не вернусь к основному.

Я подозреваю, что вас смущает тот факт, что имя вашей переменной в 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 будет отражать это изменение.

...