Рекурсивная функция - это функция, которую вызывает сама по себе
Это позволяет программистам писать эффективные программы, используя минимальный объем кода .
Недостатком является то, что они могут вызывать бесконечные циклы и другие неожиданные результаты, если написано неправильно .
Я объясню как Простая рекурсивная функция, так и хвостовая рекурсивная функция
Для того, чтобы написать Простая рекурсивная функция
- Первое, на что нужно обратить внимание, это когда вы решите выйти
цикла, который является циклом if
- Во-вторых, что делать, если мы являемся нашей собственной функцией
Из приведенного примера:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Из приведенного выше примера
if(n <=1)
return 1;
Является решающим фактором при выходе из цикла
else
return n * fact(n-1);
Фактическая обработка, которая должна быть сделана
Позвольте мне разбить задание по одному для простоты понимания.
Давайте посмотрим, что произойдет внутри, если я бегу fact(4)
- Подставляя n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
цикл завершается ошибкой, поэтому он переходит в else
цикл
так что возвращается 4 * fact(3)
В стековой памяти у нас есть 4 * fact(3)
Подставляя n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
цикл завершается ошибкой, поэтому он переходит к else
цикл
, поэтому возвращается 3 * fact(2)
Помните, мы назвали `` `4 * fact (3)` `
Выход для fact(3) = 3 * fact(2)
Пока в стеке 4 * fact(3) = 4 * 3 * fact(2)
В стековой памяти у нас есть 4 * 3 * fact(2)
Подставляя n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
цикл завершается ошибкой, поэтому он переходит к else
цикл
поэтому возвращается 2 * fact(1)
Помните, мы звонили 4 * 3 * fact(2)
Выход для fact(2) = 2 * fact(1)
Пока в стеке есть 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
В стековой памяти у нас есть 4 * 3 * 2 * fact(1)
Подставляя n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
петля верна
так что возвращает 1
Помните, мы звонили 4 * 3 * 2 * fact(1)
Выход для fact(1) = 1
Пока в стеке есть 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Наконец, результат fact (4) = 4 * 3 * 2 * 1 = 24
![enter image description here](https://i.stack.imgur.com/ELSwN.jpg)
Хвостовая рекурсия будет
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- Подставляя n = 4
public static int fact(4, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(4-1, running_total*4);
}
}
If
цикл завершается ошибкой, поэтому он переходит к else
цикл
поэтому он возвращает fact(3, 4)
В стековой памяти у нас есть fact(3, 4)
Подставляя n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
цикл завершается ошибкой, поэтому он переходит к else
цикл
так что возвращает fact(2, 12)
В стековой памяти у нас есть fact(2, 12)
Подставляя n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
цикл завершается ошибкой, поэтому он переходит к else
цикл
так что возвращается fact(1, 24)
В стековой памяти у нас есть fact(1, 24)
Подставляя n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
петля верна
так что возвращает running_total
Выход для running_total = 24
Наконец, результат факт (4,1) = 24
![enter image description here](https://i.stack.imgur.com/FkcU1.jpg)