Оператор return передает значение обратно непосредственному вызывающему кадру call-кадра текущей функции. В случае рекурсии этот непосредственный вызывающий объект может быть еще одним вызовом той же функции.
В большинстве языков, если вы не используете возвращаемое значение вызванной вами функции (рекурсивно или нет), либо возвращаемое значение отбрасывается, либо это диагностируемая ошибка. Есть некоторые языки, в которых возвращаемое значение последнего вызова функции автоматически повторно используется как возвращаемое значение текущего вызова функции, но они не различают обычные и рекурсивные вызовы функций.
Предполагая, что неиспользуемые возвращаемые значения молча отбрасываются, если вы написали такой код:
list *search_list(list *l, item_type x) {
if (l == NULL) return(NULL);
if (l->item == x)
return(l);
else
search_list(l->next, x); // no return!
}
затем search_list
возвращает только определенное значение для пустого списка (NULL) или если первый элемент соответствует значению, которое вы ищете. Как только функция переходит в рекурсивный вызов, вы не знаете, каким будет результат, потому что результат рекурсивного вызова отбрасывается.
Кроме того, вы обещаете вернуть значение из вашей функции, но у вас есть путь (рекурсивный), в котором вы не указываете, какое значение возвращать. В зависимости от языка, который вы используете, это обычно приводит либо к обязательной диагностике, либо к неопределенному поведению (что означает сокращение: может произойти все, что угодно, и может измениться в любое время без уведомления. ваша самая важная презентация). В некоторых ситуациях пропущенное возвращаемое значение может работать, но оно может измениться при следующем запуске программы (с перекомпиляцией или без нее).
return
делает последний .