Рекурсия с или без оператора возврата в завершающем состоянии

Пожалуйста, объясните, как оператор return работает для простого рекурсивного анализа дерева

СЛУЧАЙ А:

if (true) push &stack; //push path result onto a stack
else{
   if (terminating condition true) return;
   else {
      condition 1 recursion to next node
      condition 2 recursions to next node
      ...
      condition n recursion to next node
   }
   recursion to next path;
}

ДЕЛО Б:

if (true) {
   push &stack; //push path result onto a stack
   return;
}else{
   if (terminating condition true) return;
   else{
      condition 1 recursion to next node
      condition 2 recursion to next node
      ...
      condition n recursion to next node
   }
   recursion to next path;
}

Дело А работает нормально для меня. Но я не понимаю, что происходит после того, как результат помещается в стек. Как "это" знает, чтобы прекратить эти пути?

2 ответа

Решение

Для функции возвращаемого типа void оператор возврата не является строго обязательным. Если конец такой функции достигнут, не встретив оператор return, управление передается вызывающей стороне, как если бы встречался оператор return без выражения. Другими словами, неявное возвращение происходит после завершения последнего оператора, и управление автоматически возвращается к вызывающей функции. В любом случае, вам не нужно платить за другую строку кода, это хорошая практика, чтобы добавить оператор возврата.
Но обратите внимание, что для функции, объявленной с не возвращаемым типом возврата, это необходимо. Иногда это работает без оператора return, например, такого: Путаница с возвращаемым значением функции. Но это результат неопределенного поведения.

Случай А работает, потому что результаты помещаются в стек или вектор, или любую используемую структуру, а затем завершают этот конкретный путь. Если был возврат, он запускает синтаксический анализ стека и выполняет шаги назад по предыдущим итерациям. Таким образом, в случае B будет найден только один результат.

Другие вопросы по тегам