Зачем здесь нужны операторы if для работы? - PullRequest
1 голос
/ 12 октября 2019

Когда я попытался реализовать последовательность Фибоначчи с помощью рекурсии в C, я заметил, что в моей функции fibo , если я не использовал какой-то оператор if, который возвращает 1 из функции, программа потерпела крах. Почему это случилось?

#include<stdio.h>

int fibo(int);
int main(void){
    int n, num;

    scanf("%d", &n);

    num = fibo(n);
    printf("apo: %d", num);
    return 0;
}


int fibo(int n){
    if(n==0)
        return 0;
    else if(n==1)
        return 1;
    else if(n!=0){
        n = fibo(n-1) + fibo(n-2);
    return n;
    }
}


/*FOR EXAMPLE if I leave the fuction like this, it doesn't work*/
int fibo(int n){
        n = fibo(n-1) + fibo(n-2);
    return n;
}

Ответы [ 2 ]

3 голосов
/ 12 октября 2019

Давайте рассмотрим простейший случай рекурсивной функции.

int foo(int n) 
{ 
    return foo(n-1); 
}

Если вы хотите вычислить foo(5), то функции foo потребуется вычислить foo(4) перед возвратом. Но то же самое относится и к foo(4). Сначала нужно вычислить foo(3). Таким образом, нет значения для n, когда функция не должна вызывать себя, поэтому повторяется бесконечно. В теории это так. На практике это потерпит крах.

Те случаи, которые не вызывают рекурсивный вызов, называются базовые случаи .

1 голос
/ 12 октября 2019

Ваша функция нуждается в ограничении (базовый случай), чтобы больше не выполнять себя. Если у вас нет инструкции «если», чтобы решить, когда выйти из функции, ваша следующая программа не может быть выполнена. и функция не остановится, пока ваша программа не свернется.

...