Почему моя факториальная функция всегда возвращает 1? - PullRequest
2 голосов
/ 27 октября 2019

Я изучаю C и придумала эту однострочную факториальную функцию, используя тернарный оператор в возврате, но она всегда возвращает 1.

#include <stdio.h>

int factorial(int n){
    return  (n > 1) ? factorial(n -1) : 1;
}

int main() {
    for(int i = 0; i < 10; i++){
        printf("%d factorial is %d\n",i,factorial(i));
    }
    return 0;
}

Вы видите код, возвращающий 1 для значенийОт 0 до 9 в этой ссылке: https://code.sololearn.com/c7uSnfxw92sl/#c

Ответы [ 2 ]

4 голосов
/ 27 октября 2019

Вы забыли умножить на n

int factorial(int n){
    return (n > 1) ? n * factorial(n -1) : 1;
}
1 голос
/ 27 октября 2019

Это очень просто, так как мы можем использовать правила подстановки. Например.

factorial(10);                    // ==
(10 > 1) ? factorial(10 - 1) : 1  // ==
(9 > 1) ? factorial(9 - 1) : 1    // ==
(8 > 1) ? factorial(8 - 1) : 1    // ==
(7 > 1) ? factorial(7 - 1) : 1    // ==
(6 > 1) ? factorial(6 - 1) : 1    // ==
(5 > 1) ? factorial(5 - 1) : 1    // ==
(4 > 1) ? factorial(4 - 1) : 1    // ==
(3 > 1) ? factorial(3 - 1) : 1    // ==
(2 > 1) ? factorial(2 - 1) : 1    // ==
(1 > 1) ? factorial(1 - 1) : 1    // ==
1

Ваша функция нарушена. Он не умножает n на результат факториала (n - 1). Вы также можете сделать это с аккумулятором, чтобы он стал хвостовой рекурсией, но вы не можете просто заменить его на factorial(n - 1), так как он не будет вычислять то же самое, что и factorial(n).

...