Законно ли уменьшать аргументы внутри функции?

int Test(int num){
  if(num == 0)
  {
    return 0;
  }
  else
  {
    printf("%d,", num);
    Test (num--);  //-- Is this statement is legal ?
  }
}
0
sasha 24 Апр 2017 в 15:51

2 ответа

Лучший ответ

Это правильный пример для рекурсивной функции. Обратите внимание, что каждый вызов Test будет иметь свои собственные num, но они не разделяют одно и то же num. Вот почему это на самом деле то же самое:

int Test(int num){
  if(num == 0) {
    return 0;
  }
  else
  {
    printf("%d,", no);
    Test (num - 1);  // Simply subtract one here
  }
}

Также вы получите бесконечный цикл при вызове с номером <0:

Test(-1) // This loops forever
0
thertweck 24 Апр 2017 в 13:01

(Я предполагаю, что это код Java?)

Это совершенно законно, но обратите внимание, что это не влияет на переменную вне функции - num копируется по значению в функцию, поэтому вы только редактируете копию. Каждый раз, когда вы вызываете Test, он получает новую копию текущего значения num, откуда он был вызван. Так, например, с этим кодом:

int num = 2;
printf("Num before Test : %d,", num);
int res = Test(num);
printf("Result : %d,", res);
printf("Num after Test : %d,", num);

int Test(int num){
    if(num == 0)
    {
        return 0;
    }
    else
    {
        printf("In Test : %d,", num);
        Test (num--); 
    }
}

Выход будет:

Num before Test : 2
In Test : 2
In Test : 1
Result : 0
Num after Test : 2

Обратите внимание, что хотя res является, вероятно, желаемым результатом, num не изменяется.

0
Karl Reid 24 Апр 2017 в 13:02