Рекурсивна функція - це функція, яка викликає сама по собі
Це дозволяє програмістам писати ефективні програми, використовуючи мінімальну кількість коду .
Мінус полягає в тому, що вони можуть спричинити нескінченні петлі та інші несподівані результати, якщо записані неправильно .
Я поясню як просту рекурсивну функцію, так і хвостову рекурсивну функцію
Для того, щоб написати просту рекурсивну функцію
- Перший момент, який слід врахувати, - це коли ви вирішите вийти з циклу, який є циклом 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