Вот такой код придумал:
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;
}
Всё правильно?
Java
Вычислить факториал числа с помощью рекурсии
Слишком переусложнённо и с ненужными внешними переменными. Всё проще:
public static double fact(long n) { return n <= 1? 1.0 : fact(n - 1) * (double)n; }
public static double fact(long n) { return n <= 1? 1.0 : fact(n - 1) * (double)n; }
Неправильно. Тут, фактически, никакой рекурсии нет, поскольку не меняется аргумент рекуррентной функции. За глобальные переменные в мои времена тоже расстреливали в детстве из рогатки. Что будет, если я захочу посчитать произведение факториалов? Посчитай factorial(4)*factorial(3), например. Правильный ответ 144, а у тебя будет 24.
Ермек Мамаев
24 у нас получилось из-за использования глобальной переменной?
Ермек Мамаев
А эта рекурсия часто требуется в реальном программировании?
Ермек Мамаев
Реально же рекурсия нужна в основном для обхода всяких деревьев типа файловой системы и в алгоритмах сортировки?
Простому кодеру вряд ли потребуется писать с нуля такие алгоритмы сортировки, максимум потребуется обойти деревья типа каталогов и файлов в файловой системе или построить вложенное меню?
Простому кодеру вряд ли потребуется писать с нуля такие алгоритмы сортировки, максимум потребуется обойти деревья типа каталогов и файлов в файловой системе или построить вложенное меню?
у вас есть вызов метода из этого метода... т. е. какая-то рекурсия у вас есть...
всё остальное.... неверно...
всё остальное.... неверно...
Ермек Мамаев
Та я уже понял.
А эта рекурсия часто применяется? Она нужна в основном, чтобы всякие деревья обходить?
А эта рекурсия часто применяется? Она нужна в основном, чтобы всякие деревья обходить?
Вообще, лучше использовать 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())));
}
По определению, если его не строго определять, то 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())));
}
Алекс G
Кстати. В моей реализации нет гварда на отрицательные числа и на 0 в качестве входного значения. Факториал нуля - это 1. Поэтому лучше тогда поставить гвард
if (n == 0) вместо if (n == 1). Гвард на отрицательные числа можно поставить до вызова данной функции, чтобы эта функция занималась поиском факториала уже на корректных данных.
if (n == 0) вместо if (n == 1). Гвард на отрицательные числа можно поставить до вызова данной функции, чтобы эта функция занималась поиском факториала уже на корректных данных.
Похожие вопросы
- Составь программу в зависимости величины даны чисел матрица количество положительных и отрицательных элементов
- Задача Есть 2 массива. из первого массива все положительные числа переносим в начало второго массива
- в java перечисления не привязаны к числам???
- Java сравнение чисел
- Помогите написать java программу нахождения максимального числа из 4-х
- как разбить четырехзначное число на цифры java
- Подскажите, есть ли какая-нибудь команда в Java, которая позволит выбирать рандомно только между определёнными числами?
- Что делает store_(число) и load_(число) в байткоде метода класса?
- Программисты java, требуется ваша помощь!!!
- Задача. Есть несколько множеств множеств с числом элементов от 1 до 3 - пересечения возможны. Далее внутри...
Мой проще понять, хотя и слишком много буков лишних.