Почему моя программа FirstFactorial продолжает возвращаться к условию while, даже если условие не выполнено - PullRequest
2 голосов
/ 24 января 2020

Вот фрагмент кода, это при запуске с номером 4 выводит 2424242448484848288288288288576576576576. Не уверен, почему выполнение перешло бы назад, когда l oop после выхода из кода функции. Любая помощь будет оценена. Заранее спасибо.

#include <stdio.h>
#include <string.h>

int result = 1;
void FirstFactorial(int);

void FirstFactorial(int num) {
    // code goes here
    while (num > 0) {
        result = result * num;
        num--;
        FirstFactorial(num);
    }
    printf("%d", result);
}

int main(void) {
    int var;
    // keep this function call here
    printf ("Enter your no.\n");
    scanf("%d", &var);
    FirstFactorial(var);
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Либо вы реализуете факториал с помощью al oop, либо вы делаете это рекурсивно.

Возможны оба варианта, но ваш код смешивает их.

0 голосов
/ 24 января 2020

Ваша функция смешивает итеративный и рекурсивный подходы. Вы можете исправить это, удалив бесполезную рекурсию, которая приводит к вычислению и печати нескольких промежуточных результатов. Определение result как глобальной переменной также является ошибкой, тем более что вы не инициализируете ее до l oop. Использование типа long long позволит вычислять факториалы большего размера. Также рекомендуется добавить трейлинг \n после спецификатора конвертации printf.

Вот исправленная версия:

#include <stdio.h>

void FirstFactorial(int num) {
    long long result = 1;

    while (num > 1) {
        result = result * num;
        num--;
    }
    printf("%lld\n", result);
}

int main(void) {
    int var;
    // keep this function call here
    printf("Enter your number\n");
    if (scanf("%d", &var) == 1)
        FirstFactorial(var);
    return 0;
}
0 голосов
/ 24 января 2020

Внутри функции

void
FirstFactorial(int num)
{
  // code goes here
  while(num > 0)
    {
      result = result * num;
      num--;
      FirstFactorial(num);
    }
  printf("%d", result);
}

каждая ее итерация вызывает себя num раза, и все итерации вместе выводят результат глобальной переменной.

Так, например, при первом вызове функции функция вызывает себя в while l oop для диапазона значений [num, 1].

Удалите while l oop и не используйте глобальную переменную.

Вот демонстрационная программа.

#include <stdio.h>

unsigned long long int factorial( unsigned long long int n )
{
    return n < 2 ? 1 : n * factorial( n - 1 );
}

int main(void) 
{
    printf( "%llu! = %llu\n", 4llu, factorial( 4 ) );
    printf( "%llu! = %llu\n", 20llu, factorial( 20 ) );

    return 0;
}

Вывод программы:

4! = 24
20! = 2432902008176640000

Обратите внимание, что максимальное значение, которое вы можете указать, составляет 20.

...