Возврат значений через подпрограмму - PullRequest
0 голосов
/ 04 февраля 2020

Ниже приведен простой код, который пользователь дает число, и он находит последовательность Фибоначчи до этого числа. Вопрос в том, приведем ли мы, например, 5. Сначала он работает, пока не достигнет Nth_Fib_number = Fib_n(i). Затем он попадает внутрь подпрограммы и, поскольку i = 0; (из l oop основной программы), то res=0; и возвращает res;, что равно 0. Во-вторых, мы получаем i=1; (из l oop основной программы) затем res=1; и он возвращает res; а это 1.

Часть, которая меня смущает, теперь предназначена для i=2;. Она проходит через подпрограмму и переходит на res=Fib_n(n-1)+Fib_n(n-2). Здесь res = 1 + 0, я думаю. После этого он переходит к res=1;, а затем возвращает res; Снова после этого он переходит к res=0; и возвращает res; После этого он возвращает res; еще раз и переходит на main.

Проблема в том, что я не могу понять, что происходит в третьем л oop. Мы получаем res=Fib_n(2-1)+Fib_n(2-2);, и после этого он снова вызывает себя и говорит, что res=1;. Почему res получил равный одному? Кроме того, когда сразу же возвращается res, возвращается ли res со значением 3?

Я пытался отладить его, но мне не удалось увидеть переменные, которые я хочу.

Извините, за длинную статью. Спасибо за ваше время, ценим вашу помощь.

#include <stdio.h>
int Fib_n( int n);
int main( void )
{ 
    int Nth_Fib_number, i, n;
    printf("Give a number N, in order to get the Fib(N):\n");
    scanf("%d", &n);

    for (i=0; i<=n; i++)
    {
        Nth_Fib_number = Fib_n( i );
        printf("%d: Fibonacci( %d ) = %d\n", i, i, Nth_Fib_number);
    }
}

int Fib_n( int n)
{
    int res;

    if (n==0){
        printf("%d",res);
        res = 0;
    }else
        if (n==1)
            res = 1;
        else
            res = Fib_n(n-1) + Fib_n(n-2);
    return res;
}

1 Ответ

0 голосов
/ 04 февраля 2020

Проблема в том, что вы печатаете значение до инициализации переменной. Это неопределенное поведение. Помните, что каждый раз, когда вы вызываете Fib_n, у него появляется новая переменная res, которая совершенно не связана с предыдущими вызовами.

Кроме того, ваш код выглядит очень грязно. Вы действительно должны поместить фигурные скобки вокруг блока else, как это:

}else {
    if (n==1)
        res = 1;
    else
        res = Fib_n(n-1) + Fib_n(n-2);
}

Но IMO, код выглядит довольно грязно в любом случае. Я бы написал так:

int Fib_n(int n)
{
    if(n==0) return 0;
    if(n==1) return 1;
    return Fib_n(n-1) + Fib_n(n-2);
}

Нет необходимости в отдельной возвращаемой переменной для такой простой функции.

...