#include <stdio.h>
int factorial(int num);
int main()
{
int num;
printf("Enter a number to print its factorial\n");
scanf("%d",&num);
printf("factorial is %d",factorial(num));
return 0;
}
int factorial(int num)
{
if (num==1)
{
return 1;
}
int factNm1,factN;
printf("%d,num);
//why is it even printing 2 and not 1 when i print the value of num AND HOW THE other values are getting
//stored in factNm1?
factNm1 = factorial(num-1);
factN = factNm1 * num;
return factN;
}
Результат нормальный, я откуда-то скопировал этот код, но до сих пор не могу его понять.
Очистка форматирования этой функции:
int factorial(int num)
{
if (num == 1)
{
return 1;
}
int factNm1, factN;
printf("%d", num);
factNm1 = factorial(num - 1);
factN = factNm1 * num;
return factN;
}
Это очень просто. Если num
равно 1
, функция немедленно возвращает 1
. Конец истории.
В противном случае поток управления продолжается. Объявлены две новые переменные int
. Мы также печатаем значение num
, которого не может быть 1
, иначе мы бы никогда не дошли до этого вывода.
factNm1
является результатом вызова той же функции факториала, но с меньшим числом. Это означает, что, если мы не указали отрицательное число или ноль, мы сходимся к 1
, что является базовым случаем для рекурсии.
Затем мы возвращаем полученное значение, умноженное на входное значение num
. Таким образом, что-то вроде factorial(4)
фактически является 4 * 3 * 2 * 1
.
Рекурсивная функция глубоко вызывает функцию внутри себя до тех пор, пока не возникнут некоторые условия.
Пример:
function recursiveFunction(n){
// calling itself
return n * recursiveFunction(n-1)
}
Давайте посмотрим, как это работает?
Когда вы вызываете recursiveFunction(5)
он возвращает 5 * recursiveFunction(4) но подождите... само возвращаемое значение содержит вызов, нам нужно решить его, прежде чем вернуться. поэтому он возвращает 5 * 4 * recursiveFunction(3) это продолжается как 5 * 4 * 3 * 2 * 1 * -1 * -2 * -3 * recursiveFunction(-4) и так далее.
Чтобы остановить рекурсивную функцию, нам нужно условие остановки, и в этом случае нам нужно остановиться, когда число станет равным 1.
поэтому мы можем изменить приведенный выше код следующим образом:
function recursiveFunction(n){
if (n=1){
return 1;
// it stops before calling itself again, and we get a number instead of another deep call.
}
// calling itself
return n * recursiveFunction(n-1)
}
поэтому после 5 * 4 * 3 * 2 * recursiveFunction(1) мы просто получаем 5 * 4 * 3 * 2 * 1
рекурсия полезна при решении многих алгоритмических задач. счастливого кодирования
В этом вопросе конкретно упоминается C. Почему вы предлагаете код на Javascript?
Я думаю, ему нужно изучить эту концепцию, а я разработчик JS.
Я не буду вдаваться в подробности проблем в вашем коде, а лишь объясню, как он работает.
Каждая рекурсия должна иметь хотя бы одно завершающее условие.
В функции factorial()
условие завершения рекурсии таково:
if (num==1)
{
return 1;
}
Например. принять значение num
как 4
First call : num is 4
4==1 : false
factorial(4-1) --> Recursive call 1 : num value is 4 here
| 3==1 : false
| factorial(3-1) --> Recursive call 2 : num value is 3 here
| | 2==1 : false
| | factorial(2-1) --> Recursive call 3 : num value is 2 here
| | | 1==1 : true
| | | | [Hit the terminating condition]
| | | | [Last recursive call will return 1 and stack will wind up now]
| | | |
| | | |
| | | return 1;
| | factNm1 = 1; factN = 1 * 2; return 2; // num is 2 here, factN calculated to 2
| factNm1 = 2; factN = 2 * 3; return 6; // num is 3 here, factN calculated to 6
factNm1 = 6; factN = 6 * 4; return 24; // num is 4 here, factN calculated to 24
Следовательно, результат, который вы получаете для значения num
4
, равен 24
.
замечательный парень, долго пытался это понять, мне очень помогло!