Юлия
Юлия

Вычислить факториал числа с помощью рекурсии

Вот такой код придумал:

static double f = 1;
static long i = 1;

public static double factorial(long in) {
if(i > in) {
return f;
}
f *= i;
i++;
factorial(in);

return f;
}

Всё правильно?

СМ
Светька Матвеева

Слишком переусложнённо и с ненужными внешними переменными. Всё проще:

public static double fact(long n) { return n <= 1? 1.0 : fact(n - 1) * (double)n; }

ИФ
Игорь Федосеев

Вообще, лучше использовать long в качестве возвращаемого значения. Это более понятно, нежели когда возвращается double. Даже несмотря на то, что Double.MAX_VALUE > Long.MAX_VALUE. Если нужно считать прямо супер огромные значения факториалов, то во-первых, использовать рекурсию точно менее продуктивно, нежели циклы, во-вторых, для очень больших чисел лучше тогда использовать тип BigInteger, ибо и double не резиновый, а BigInteger условно безразмерный.
По определению, если его не строго определять, то n! = (n - 1)!*n. Из такого определения видно, что ожидается, что изнутри функции факториала, будет вызываться та же функция на аргументе, который меньше на 1. И так до тех пор, пока не дойдем до 1. Получается:
long fact(long n) {
if (n == 1) {
return 1;
}

return n * fact(n - 1);
}

Можно заинлайнить, чтобы просто одна строчка была.

Вот реализация на BigInteger:
BigInteger fact(BigInteger n) {
if (n.equals(BigInteger.ONE)) {
return BigInteger.ONE;
}

return n.multiply(fact(n.add(BigInteger.ONE.negate())));
}

Дмитрий Ионов
Дмитрий Ионов

Неправильно. Тут, фактически, никакой рекурсии нет, поскольку не меняется аргумент рекуррентной функции. За глобальные переменные в мои времена тоже расстреливали в детстве из рогатки. Что будет, если я захочу посчитать произведение факториалов? Посчитай factorial(4)*factorial(3), например. Правильный ответ 144, а у тебя будет 24.

Ал
Алексей

у вас есть вызов метода из этого метода... т. е. какая-то рекурсия у вас есть...
всё остальное.... неверно...

Похожие вопросы
Сколькими нулями оканчивается число 2010! (факториал 2010)? Сколькими нулями оканчивается число 2010! (факториал 2010)?
объясните как найти факториал числа в паскале!
Сколькими нулями оканчивается число 2008 факториал?
Как можно решить эту задачу при помощи рекурсии? ( Pascal)
паскаль рекурсия вычислить
Факториал большого числа
Чему равен факториал числа Пи?
факториал отрицательного числа
Помогите вычислить (факториал)
Буду безмерно благодарен. Вычислить к-ую цифру числа Трибоначчи