Как операторы return выполняются в C, если есть несколько операторов return? - PullRequest
0 голосов
/ 03 ноября 2018

Насколько я знаю C, в следующем коде должен быть выполнен первый оператор возврата в функции fact. Вместо этого выполняется последний оператор возврата в функции. Как работает код здесь? Почему первый оператор возврата в функции fact не выполняется?

Факториал числа:

#include <stdio.h>
int a = 2, count = 1, fact0 = 1;

int fact(int n) {
    if (n == count) {
        return fact0;//Only this return statement should be executed
    }
    fact0 = fact0 * a;

    a++;
    count++;
    fact(n);
    return 1;//But this return statement is executed , Why?
}

int main() {
    int n;
    setbuf(stdout, NULL);
    printf("Enter the factorial number\n");
    scanf("%d", &n);
    printf("The factorial of the number is %d", fact(n));
    return 0;
}

Вывод:

Enter the factorial number
 4
The factorial of the number is 1

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Проблема в том, что со значением, равным 4, вы вводите несколько уровней рекурсии.

Как только все вспомогательные вызовы заканчиваются, программа просто запускается и выполняет последний оператор возврата, который в любом случае дает вам 1.

Рабочий подход состоит в том, чтобы возвращать fact (n) вместо того, чтобы просто вызывать его и вместо этого удалять последний оператор return.

0 голосов
/ 03 ноября 2018

Вам нужно научиться отлаживать свой код. Хорошее начало - изменить fact так:

int fact(int n) {
    printf("a: %d count: %d fact0: %d n: %d\n", a, count, fact0, n);
    if (n == count) {
        printf("n is equal to count\n");
        return fact0;//Only this return statement should be executed                                               
    }
    fact0 = fact0 * a;

    a++;
    count++;
    fact(n);
    return 1;//But this return statement is executed , Why?                                                        
}

Тогда пробег будет выглядеть так:

$ ./a.out 
Enter the factorial number
4
a: 2 count: 1 fact0: 1 n: 4
a: 3 count: 2 fact0: 2 n: 4
a: 4 count: 3 fact0: 6 n: 4
a: 5 count: 4 fact0: 24 n: 4
n is equal to count
The factorial of the number is 1

Это должно дать довольно хороший ключ к пониманию того, что происходит. При необходимости добавьте больше операторов печати. ​​

0 голосов
/ 03 ноября 2018

У вас есть куча вызовов вложенных функций. Самый внутренний возвращается из того места, где вы ожидаете, остальные из другого оператора return.

// 1st call, in main
fact(4); // calls fact(4) with count == 2
    fact(4); // calls fact(4) with count == 3
        fact(4); // calls fact(4) with count == 4
        return fact0; // as expected
    return 1;
return 1;
...