Факториал числа, используя рекурсию

Я имею ниже рекурсивной функции, чтобы вычислить факториал числа. Программа хорошо работает кроме тех случаев, когда я удаляю если условие. Кто-то может объяснить почему?

Это - код, который хорошо работает-

public static long factUsingRecursion(int number) {
    if (number == 1) {
        return 1;
    } else {
        return number * factUsingRecursion(number - 1);
    }
}

Без, если условие (Кодекс, который бросает ошибку),

public static long factUsingRecursion(int number) {
    return number * factUsingRecursion(number - 1);
}

Я получаю ошибку переполнения стека.

Исключение в нити, "главной" java.lang. StackOverflowError в birst. FactorialUsingRecursion.factUsingRecursion(FactorialUsingRecursion.java:10)

Просить экспертов по возможности советовать мне почему дело обстоит так?

0
longs не ограничиваются положительными числами. Компьютеры сделают то, что вы говорите им делать.... так it' s не как функция волшебно остановится, как только число равняется 1. Без, если заявление, вы выдвигаете функцию после функции на стек без шанса для какого-либо из заявлений когда-нибудь возвращению и заканчиваете рекурсию. число направится к отрицательной бесконечности до переполнений стека
добавлено автор sunrize920, источник
Намек: Без, если - как вы решаете, когда остановиться?
добавлено автор cpt. jazz, источник
Можно только выбрать один "принятый ответ" в вопросе.
добавлено автор rgettman, источник
У любой рекурсии должно всегда быть основное условие закончить рекурсию. Это, если условие для основного условия только. Еще это станет бесконечной рекурсией.
добавлено автор Rohit Jain, источник

7 ответы

В рекурсии должен всегда быть основной случай, который останавливает рекурсию. Без , если , у вас нет основного случая и ничто не останавливает его. В конечном счете слишком много вызовов метода находятся на стеке и StackOverflowError результаты.

7
добавлено
Почему этот downvoted?
добавлено автор Rohit Jain, источник

Эта линия, вызывающая, число переменная, которая будет уменьшена на 1

return number * factUsingRecursion(number - 1);

и это будет обращаться со всеми значениями число кроме тех случаев, когда это 1

таким образом, эта линия кода - условие разрыва

if (number == 1) {
        return 1;

}

и это предотвращает вас, чтобы избежать stackoverflow исключения

2
добавлено

Вообразите то, что происходит, когда вы звоните:

factUsingRecursion(3);

С, если:

3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1

Без, если:

3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1*factUsingRecursion(0)
3*2*1*0*factUsingRecursion(-1)
3*2*1*0*-1*factUsingRecursion(-2)
3*2*1*0*-1*-2*factUsingRecursion(-3)
...
And so on... It will not stop until you encounter the StackOverflow error
2
добавлено
@user2341013 You' приветствие ре. btw, на StackOverflow, можно только принять (зеленая галочка) один ответ, так выбирают тот помогший вы больше всего. Вы можете upvote (стрелка вверх) как много ответов, как вам нравится.
добавлено автор Paulpro, источник
Большое спасибо. Его очень ясное теперь. Цените свой быстрый ответ!
добавлено автор user2341013, источник
Несомненно, я получил его.Thank you. В этом случае, хотя, все ответы помогли мне;)
добавлено автор user2341013, источник

Рекурсия требует основного случая. Без него это продолжит вызывать функцию много раз и никогда не останавливаться. Если заявление является </ими> основной случай, который заканчивает рекурсию. Именно поэтому, если вы удаляете его, вы получаете StackOverflowError .

2
добавлено
Почему был этот ответ downvoted?
добавлено автор rgettman, источник

Программа больше не будет работать, когда вы удалите, если условие, потому что вас просто оставят с число возвращения * factUsingRecursion (число - 1); и factUsingRecursion (число - 1) здесь имел бы то же самое возвращение, звоня число возвращения * factUsingRecursion (число - 1); . Ваша функция постоянно называет себя, никогда не способным оценить к чему-либо. Устанавливая условие, вы функционируете, в состоянии оценить к категорической стоимости в какой-то момент в рекурсивной цепи, и первое требование может оценить.

1
добавлено

Это теряет одну из вещей, которая делает рекурсивную функцию рекурсивной в этом, у этого нет выходного условия.

Все рекурсивные решения должны удовлетворить три правила или свойства: Рекурсивное решение должно содержать основной случай. Рекурсивное решение должно содержать рекурсивный случай. Рекурсивное решение должно сделать успехи к основному случаю.

От: структуры данных и алгоритмы Используя питона

1
добавлено

Для каждого целого числа i, вы вызываете функцию со мной-1. Integersa бесконечны, таким образом, вы никогда не прекращали бы вызывать функцию. например:-1000 звонил бы-1001, и это будет продолжать идти, у целого JVM есть некоторое пространство в, он - стек.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async