Теоретический вопрос здесь об основе или останавливающемся случае в рекурсивном методе, каковы его стандарты?
Я имею в виду, действительно ли нормально не иметь тело в нем, просто оператор возврата?
Всегда это как следующее:
if (input operation value)
return sth;
У Вас есть различные мысли об этом?
Шаблон для рекурсивных функций состоит в том, что они выглядят примерно так:
f( value )
if ( test value )
return value
else
return f( simplify value )
Я не думаю, что вы можете сказать больше, чем это об общих случаях .
Базовый случай - это прервать цикл (избежать превращения в бесконечную рекурсию). Стандарта в базовом случае нет, в качестве него можно выбрать любой вход, достаточно простой для точного решения.
Например, это вполне допустимо:
int factorial (int n) {
if (n <= 5) {
// Not just a return statement
int x = 1;
while (n > 0) {
x *= n;
-- n;
}
return x;
} else {
return n * factorial(n-1);
}
}
В некоторых случаях ваш базовый случай -
return literal
В некоторых случаях ваш базовый вариант - это не просто «вернуть литерал».
Не может быть «стандарта» - это зависит от вашей функции.
«Функция Сиракузы» http://en.wikipedia.org/wiki/Collatz_conjecture , например, не имеет тривиального базового случая или тривиального буквального значения.
"У тебя другие мысли по этому поводу ??" Это не совсем разумный вопрос.
Рекурсия должна прекратиться, вот и все. Тривиальная хвостовая рекурсия может иметь «базовый случай», который возвращает литерал, или это может быть вычисление. Более сложная рекурсия может не иметь тривиального «базового случая».
Это полностью зависит от конкретной рекурсивной функции. В общем, это не может быть пустой оператор return;
, однако - для любой рекурсивной функции, возвращающей значение, базовый случай также должен возвращать значение этого типа, поскольку func (base )
также вполне допустимый вызов. Например, рекурсивная функция факториал
вернет 1
в качестве базового значения.