public static String factorial(int n) {
BigInteger rezult = new BigInteger(String.valueOf(n*Integer.parseInt(factorial(n-1))));
return rezult.toString();
как делать через цикл понятно, но не получается через рекурсию!!! постоянно стекоферфлоу :((( Вообще не пойму - мы можем передавать в BigInteger только строку? тогда нам надо вначале valueOf - всего того что мі передаем в БигИнт - наше n*factorial(n-1).... но функция факториала нам тоже возвращает строку, поэтому перед умножением на n нам надо его распарсить в инт. я правильно понимаю логику???
проверки все то понятно... я допишу, мне интересно именно разобраться с логикой и синтаксиса этого BigIntegerAnna
20 уровень
почему StackOverflow если делать через рекурсию?
Обсуждается
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia VolkovaJava Developer в DXCMaster
16 апреля 2021, 11:30
В рекурсивном алгоритме обязательно должен быть базовый случай - тот, при котором рекурсивного вызова происходить не будет.
+3
MasterMarg
16 апреля 2021, 11:11
Так ты же неправильно факториал считаешь, ты определяешь факториал n как n* факториал n-1, а факториал n-1 - n-1* факториал n-2. Если это разложить, то ты ты просто перемножаешь n*(n-1)*(n-2) и т.д. то есть до бесконечности будешь эти скобки перемножать, а тебе надо остановиться, когда ты до 1 дойдешь)
Другими словами, рекурсия бесконечная выходит, потому что условия нет для выхода. Настоящий-то факториал не считается от отрицательных чисел, а у тебя будет и от них считаться, например факториал -1 = -1 * факториал -2 и т. д. в отрицательную бесконечность. Самое смешное, что где-то там будет факториал нуля, который посчитается как 0 * факториал -1, что как бы (не обращая внимание на абсурдность) должно все обнулить. Выходит, у тебя все факториалы равны 0, а компьютер никак не может досчитать до бесконечности, не понимая, что как бы уже 0) Наверное, пытается решить противоречие 0 * -бесконечность)
Не говоря уж о том, что факториал 0 вроде как должен быть 1
А зачем тебе это?
если ты сразу в следующей строке перемножаешь
и все, тебе это значение i нафиг не нужно уже. Да еще и массив создаешь до 150 ячеек размером, а записываешь значение в одну и ту же n-1 = 149ю ячейку.
И еще, пока заметил
Это сработает только, если у тебя факториал n-1 умещается в размерность Integer, а если нет - то там нужно делать new BigInteger(factorial(n-1)) и умножать уже так просто нельзя, надо и n делать как new BigInterger(""+n) и перемножать уже BigInteger через их методы
+1
Anna
16 апреля 2021, 11:48
спасибо. поняла... та это с массивом случайно подтянулась с Идеи самая первая версия когда я только начала думать как сделать....
0
MasterMarg
16 апреля 2021, 11:51
Дочитай сверху)
Как бы факториал 150 мне интернет насчитал
57133839564458545904789328652610540031895535786011264182548375833179829124845398393126574488675311145377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416790722118445437122269675520000000000000000000000000000000000000
Учитывая, что там есть 10, 20 и т.д в умножении, там тупо на конце 15 нулей будет после других цифр, не думаю, что это влезет в Integer (сарказм, не влезет, конечно) А если вспомнить, что там еще есть умножения типа 5*2 или 15*22, которые тоже дают числа кратные 10 - видишь сколько одних только нулей в этом числе)
Так что твое текущее решение тоже не сработает, просто ты вбивала маленькие числа, которые не выходили за пределы Integer, а если вобьешь 100+ - то программа сломается
+1
Anna
16 апреля 2021, 11:59
да, я ж BigIntegerom делаю - в него влезет
0
MasterMarg
16 апреля 2021, 11:59
Я про тот вариант, который ниже написан в коде, где ты циклом делала.
+1
Anna
16 апреля 2021, 12:00
ага... вижу... сейчас покручу, спасибо
0
MasterMarg
16 апреля 2021, 12:03
В подсказку напишу, что вроде умножение идет там так
Так как результат умножения двух BigInteger будет тоже BigInteger, то и твой rez придется тоже делать BigInteger.
На codewars похожая задача была у меня несколько месяцев назад)
+1