Сомнение относительно возврата, который звонит два раза в ту же функцию

Не, почему, в перекурсивной функции, это иногда должна называться два раза та же функция, чтобы реализовывать любое действие.

Например здесь:

int operacion (){
  char e;
  cin >> e;
  if(e  >= '0' and e <= '9') return  e - '0';
  else{
    int x = operacion(); // <<--- AQUI
    int y = operacion();
    if( e == '+') return (x + y);
    else if( e== '-') return (x - y);
    else return (x * y);
  }  
}

Не предполагается, что, когда он прибывает в int x=operacion(), игнорируется все то, что он продолжает после этой линии?

3
задан 23.11.2016, 15:44
2 ответа

Нет, перекурсивное решение (которое звонит в operacion снова), это еще одно решение. Он работает, завершается, и код продолжает:

// Llamamos a operación desde el `main()` y comienza la recursión
val = int operacion() // y el usuario escribe un +
   int x = operacion() // y el usuario escribe un +
      int x = operacion() // y el usuario escribe un 2
         return 2;
      int y = operacion() // y el usuario escribe un *
         int x = operacion() // y el usuario escribe un 4
             return 4;
         int y = operacion() // y el usuario escribe un 8
             return 8;
         return 4*8;
      return 2 + 32;
   int y = operacion() // y el usuario escribe un -
      int x = operacion() // y el usuario escribe un 6
         return 6;
      int y = operacion() // y el usuario escribe un 8
         return 8;
      return 6-8;
   return 34-2;

// val <- 32

И следовательно, перекурсивная функция возвращает стоимость 32 с этой гипотетической последовательностью стоимости, введенной пользователем.

1
ответ дан 24.11.2019, 12:49

У перекурсивной функции есть несколько характеристик.

  1. Призывается с& сам, с размером меньшей проблемы (под размером проблемы должно быть понятно решение гораздо более простое, чем первоначальная проблема).
  2. Будь должен совпадать в базовый случай, а именно, ввиду проблемы достаточно маленькое функция должна возвращать соответствующей формы решение.

Начиная с которого я могу читать Вашего кода, я понимаю, что он пробует реализовать функцию, которая захватывала бы два числа (operandos) и оператор +,, - *) и начиная с этой информации возвратил операцию применения оператор в вошедшие operandos. Не обычно использовать возврат в этой проблеме, потому что нет 'проблемы', которая могла бы быть решенной, более простой формы начиная с первоначальной проблемы используя возврат.

Так скоро перекурсивная функция прибывает в базовый случай (а именно, он возвращает результат вместо того, чтобы называть в самого себя снова) код, который назвал ее, пребывает Ваше выполнение в следующей линии. Это означает, что в этих двух линиях функции операция ()

int x = operacion();
int y = operacion();

так скоро возвратитесь нового, призванного к операции () и была распределена стоимость в переменную x, функция вновь назовет саму себя и результат Вашего выполнения будет храниться в переменной и. Это произойдет да и только да методу удается возвратить какую-то базовую стоимость (если вошедший характер - цифра 0 в 9, или операторов +,, - *), в случае которой да игнорируется оставшаяся часть кода, потому что ясной формы ключевое слово return это показывает: возвратите результат и закончите выполнение функции.

5
ответ дан 24.11.2019, 12:49