Однако после ввода числа происходит задержка, и программа останавливается
Как уже указывалось другими, printf(factorial)
имеет неопределенное поведение.Он должен быть удален или должен называться должным образом (например, printf("%d\n", factorial)
).
Не уверен, почему там есть system("pause")
, поскольку это кажется ненужным.
Удаление этих двух элементов из вашегокод, у меня не было проблем с его запуском и получением правильного ответа для факториала до 12. Опять же, как уже отмечалось другими, ваша функция будет действительна только до 12!
из-за целочисленного переполнения .
Кроме этого, ваш код может быть лучше отформатирован для ввода, например:
/* formats better than original */
printf("Enter number: ");
scanf("%d", &input);
printf("\n");
Вы можете уменьшить свою функцию calcFactorial
, так как нет необходимости вПеременная int factorial
или предложение else
.Таким образом, вы можете сделать так, чтобы это выглядело так:
int calcFactorial(int n){
if (n == 0) return 1; //base case, 0! is 1
return n * calcFactorial(n - 1); //all other cases
}
Я не до конца понимаю рекурсию и солнечные процедуры в C
По сути, ваша функция будет вызываться снова и сновас n
, и каждый раз, когда он вызывается, мы называем это экземпляром, и в каждом экземпляре n
на единицу меньше, чем было в предыдущем экземпляре.Это будет происходить до тех пор, пока не будет достигнут базовый случай (n == 0
), тогда этот экземпляр будет возвращаться к экземпляру до него, и это будет происходить до тех пор, пока не будут возвращены все экземпляры.
Для простоты, давайте пройдемся по calcFactorial(3)
.Достигнут базовый случай, который является экземпляром, который завершает дальнейшие рекурсивные вызовы и возвращает 1
.В экземпляре до достижения базового случая n == 1
, чтобы этот экземпляр возвращал 1*1
, поскольку экземпляр до того, как он возвратил 1
.Экземпляр до этого был n == 2
, поэтому этот экземпляр возвращает 2*1
.Экземпляр до этого был первым n == 3
, поэтому этот экземпляр возвращает 3*2
.Все экземпляры теперь вернулись, и результат равен 6, и это то, что мы ожидаем от 3!
.
Подробнее о рекурсии можно узнать здесь