Рекурсивная функция - это функция, которая вызывает сама по себе
Это позволяет программистам писать эффективные программы, используя минимальный объем кода .
Обратной стороной является то, что они могут вызвать бесконечные циклы и другие неожиданные результаты, если они не написаны должным образом .
Я объясню как простую рекурсивную функцию, так и хвостовую рекурсивную функцию.
Чтобы написать простую рекурсивную функцию
- Первый момент, который следует учитывать, - это когда вы должны решить выйти из цикла, то есть цикла 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 * факт (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
Наконец, результат факта (4) = 4 * 3 * 2 * 1 = 24
Хвостовая рекурсия будет
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