Това е функция, която може да се самоизвиква и е алтернатива на използването на цикли, но трябва да имаме предвид, че е по-малко ефективна.

Можем да извикаме една и съща функция определен брой пъти, докато не бъде изпълнено условие.

Сега, когато имаме представа за дефиницията на рекурсия, нека знаем как да я използваме и защо е по-добра от типичните цикли при някои обстоятелства, това ни дава решение на проблем много елегантно, но винаги преди да я използваме, трябва да имаме сигурността, че основният проблем ще бъде решен, ако не го направим, функцията ще се повтаря завинаги и това се нарича изходно условие.

Някои предимства:

  • Прости и ясни решения.
  • Можем да конвертираме сложни алгоритми в прости.
  • Много мощен.

Това е страхотно, нали?… Всичко звучи така, сякаш никога повече няма да използваме цикли, но това не е добро решение, успокой се, човече. Този мощен инструмент трябва да има предвид много важен риск. Нека ги разгледаме, за да бъдем разумни, когато го използваме, но първо, паметта.

RAM ПАМЕТ:

Нашият компютър няма безкрайно пространство в паметта за използване на програми, ако отворим много програми, нашият компютър ще има забавяне (или по-лошо), защото не е достатъчно, за да отвори всички тези програми. Когато използваме функции, случаят е същият, паметта трябва да освободи място, за да ги изпълни и това се нарича Разпределение на паметтаи когато програмата спре, паметта се освобождава отново, за да бъде използва се за друга програма и това се нарича (разбира се) Освобождаване на памет.

Както виждате най-големият ни проблем е паметта. Например, когато се извика функция, системата прави място в паметта, за да я изпълни като циклите, но в случай на рекурсия паметта за всеки път, когато повтаряме, освобождава място друг път, докато условието бъде изпълнено, когато това се случи всички паметта на нашите функции се освобождава. Това има някои проблеми, защото ако направим функция, която се извиква твърде много пъти, паметта ще бъде наситена.

Но всичко, което научихме, не е пълно, ако нямаме всички дефиниции на различни начини да го използваме, така че имаме тези форми на рекурсия:

  • Директно рекурсивно:

Тази функция се самоизвиква в един и същи блок код, той може да се извика веднъж или може да бъде извикан многократно по време на изпълнението си, но извиква само една и съща рекурсивна функция, например факторната функция:

CODE
#include<stdio.h>
long int multiplyNumbers(int n);
int main() {
    int n;
    printf("Enter a positive integer: ");
    scanf("%d",&n);
    printf("Factorial of %d = %ld", n, multiplyNumbers(n));
    return 0;
}

long int multiplyNumbers(int n) {
    if (n>=1)
        return n*multiplyNumbers(n-1);
    else
        return 1;
}
  • Непряко рекурсивно:

Функцията извиква друг метод или много, които извикват това извикване след оригиналната функция.

CODE
int testfunc1(int num) {
 if (num == 0)
 return 0;
 else
 return (testfunc2(num — 1));
}
int testfunc2(int num2) {
 return testfunc1(num2–1);
}
  • Долна рекурсия:

Нарича се също „опашка“ и когато няма чакаща операция, когато се извиква рекурсивната функция, има тази форма. Друг факториел, но във формата на опашка

CODE
int fact(int n){
  if (n == 1)
    return 1;
  else
    return (n * fact(n - 1));
}

В заключение разбираме силата на рекурсията в програмирането, но не забравяйте да я използвате само когато е необходимо и когато итерацията е по-малко ефективна, ако практикувате и имате това предвид, ще имате страхотен инструмент за използване.