Что происходит в C ++, когда мы передаем рекурсивную функцию в качестве аргумента самой функции? - PullRequest
0 голосов
/ 02 апреля 2020

В приведенном ниже коде, если я использую только factorial(n), это дает правильный вывод (120), но когда я использую factorial(factorial(n)), результат равен 0. Может кто-нибудь объяснить, что идет не так?

int factorial(int);

int main()  
{  
    int n = 5; // number of terms

    cout<<endl<<"The factorial is:"<<factorial(factorial(n));
    return 0;
}

int factorial(int x)
{
    if(x==1)
       return 1;
    else
        return x * factorial(x-1);
}

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Ваша проблема в том, что вы нажимаете целочисленное переполнение .

Как вы отметили, факториал 5 равен 120.

Итак factorial(factorial(5)) совпадает с factorial(120). Как видите, вы не передаете функцию factorial в качестве аргумента внешнему factorial. Вы передаете результат вызова внутреннего факториала в качестве аргумента для внешнего факториала. Код эквивалентен этому:

int result = factorial(5); // result = 120
factorial(result); // factorial (120)

Проблема в том, что факториал 120 равен действительно большой номер , число почти 200 цифр

Теперь это намного больше, чем может хранить int. Или даже long long unsigned int. Вам нужны специализированные библиотеки для обработки произвольно больших чисел.

1 голос
/ 02 апреля 2020

factorial(factorial(5));

эффективно оценивается так, как если бы были написаны

temp = factorial(5); factorial(temp);

На основании того факта, что мы знаем, temp будет установлено равным 120 ( нам сказали, что функция работает для аргумента 5), вопрос в том, что происходит в factorial(120).

Ответ таков: он переполняет максимальное значение целого числа.

...