Нулевой факториал, возвращающий 1 рекурсивно - PullRequest
0 голосов
/ 27 октября 2011

Как я могу заставить этот рекурсивный метод возвращать 1 при вызове 0! без проверки на базовый случай, то есть без выполнения if-else для 0 и 1.

public static long f( number ){
        if ( number <= 1 ){ // test for base case
                return 1; // base cases: 0! = 1 and 1! = 1
            } 
        else{ return number * f( number - 1 ); }
   }

Я не хочу проверять базовые случаи. Это возможно?

Ответы [ 7 ]

2 голосов
/ 27 октября 2011

Ну, базовый случай, как вы его называете, это условие остановки рекурсии ... Как вы хотите остановить рекурсию без теста?

С другой стороны, итеративная версия должна быть быстрее.

2 голосов
/ 27 октября 2011

Вам нужно только проверить регистр 0 (и для целостности, также меньше 0), хотя вам нужен базовый вариант a , иначе вы просто запустите вбесконечный цикл (или пока вы не столкнетесь с переполнением стека).Вы можете сократить код, хотя:

public static long f(int n){
    if (n<0) throw new InvalidParameterException();
    return n == 0 ? 1 : n * f(n-1);
}
2 голосов
/ 27 октября 2011

Я не хочу проверять базовые случаи. Возможно ли это?

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

2 голосов
/ 27 октября 2011

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

1 голос
/ 27 октября 2011

Вам всегда нужна проверка базового случая для рекурсии, чтобы сделать ее конечной.Кстати, базовый случай для 0 находится в факториальном определении.

0 голосов
/ 29 октября 2011

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

Определение массива (индекс от 0 до 21) функций.Каждая функция принимает параметр n.Функция с индексом 0 возвращает 1 для любого n, все остальные возвращают n раз возвращаемое значение функции с индексом n-1.Начните с вызова функции по индексу n.Нет if-else, никаких проверок ни для чего.

Достаточно размера массива 21, потому что при 21! данный тип возвращаемого значения long (64bit) переполняется, и результат в любом случае не определен.Если вы хотите избежать исключения OutOfBound, вы можете добавить оболочку, которая вызывает функцию с помощью min (n, 21).

0 голосов
/ 27 октября 2011

Использование if-else или ? : - лучшее решение. То есть что-нибудь еще может быть хуже.

public static long f(int n){
  try {
    return 0 / n + n * f(n-1);
  } catch(ArithmeticException ae) {
    return 1;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...