Member 13060183 Ответов: 5

Я не понимаю базового примера функции C. ПОЖАЛУЙСТА ПОМОЧЬ


int factorial(int x)
{
 int i;
 for(i=1; i < x; i++)
   x *= i;
 return x;
}


они привели пример:

int a=5, b;
b = factorial(a);


и сказал: "в конце этой короткой программы переменная b будет содержать 120, так как факториальная функция будет вызвана с аргументом 5 и вернет 120."

Может ли кто-нибудь объяснить, как b 120?
Можете ли вы также помочь мне прочитать код?
Что они подразумевают под " факториалом(а)"?
Подставил ли он значение а в " x *= i " ?

Что я уже пробовал:

Ничего, я просто читал книгу об этом и ничего не понимаю.

5 Ответов

Рейтинг:
38

Richard MacCutchan

Вы действительно не можете ожидать, что научитесь программированию на техническом форуме. Вам нужно найти книгу получше и попробовать некоторые онлайн-уроки.

Сказав это, приведенный вами пример не сработает.

int factorial(int x)
{
 int i;
 for(i=1, i < x, i++) // set i to the value 1, while i is less than x
   x *= i;            // multiply x by the value of i [1 .. x-1]
                      // add 1 to i and repeat.

 return x;            // return the calculated value of x
// so if x starts at 5
// it becomes x * 1 ... 5   ... i starts at 1, x starts at 5
//            x * 2 ... 10  ... i is now 2 so the loop will have another 7
//                              iterations to perform
//            x * 3 ... 30  ... but i is now 3 so it will have another 26
//            x * 4 ... 120 ... i is now 4 and x is 120, so the loop will never terminate
}

Факторная функция - это просто математическая функция.


Рейтинг:
34

OriginalGriff

Факториал-это операция, в которой вы умножаете все значения до предела и в математике выражается восклицательным знаком: 3!, или 6!, или n!

1!                          == 1
2! == 1 * 2                 == 2
3! == 1 * 2 * 3             == 6
4! == 1 * 2 * 3 * 4         == 24
5! == 1 * 2 * 3 * 4 * 5     == 120
6! == 1 * 2 * 3 * 4 * 5 * 6 == 720
...
То, что у вас есть в вашем коде, - это функция, которой передается число (в переменной, называемой x) и который возвращает Факториал этого числа, используя простой цикл для умножения. (Ну, вы бы так и сделали, если бы это компилировалось - for циклы используют точки с запятой, а не запятые - и если бы это работало правильно, если бы это было так, то этого не будет: алгоритм реализован неправильно)

Поэтому, когда вы исправите factorial функция, которую вы можете вызвать, используя ее имя в вашем коде:
b = factorial(a);
и это приводит к тому, что ваш код "ветвится" на факториальную функцию, копируя значение в a в x когда он попадает туда, то "возвращается" к исходному коду и помещает значение, которое факториал вернул (через return оператор) в переменную b

Это похоже на список битов текста, которые вы часто публикуете, чтобы не печатать их каждый раз: вы храните их в блокноте, а когда вы хотите опубликовать один из них, вы копируете его из блокнота и вставляете в свой браузер. Каждый текстовый фрагмент - это функция, и copy'n'paste "вызывает" его в ваш пост. Есть смысл?


Рейтинг:
22

Jochen Arndt

Видеть Факториал-Википедия[^].

Функция int factorial(int x) это C-реализация алгоритма, описанного в приведенной выше ссылке на Википедию.

x *= i это то же самое, что x = x * i.

Пример объявляет два int переменные и вызывает функцию для выполнения вычисления, где значение a передается в качестве параметра, а результат, возвращаемый функцией, сохраняется в b.


Рейтинг:
15

Patrice T

Мой общий совет - использовать отладчик, чтобы увидеть, что делает код, но, насколько я вижу, в вашем случае функция просто неверна.

Цитата:
Что они подразумевают под " факториалом(а)"?

Факториал-это математическая функция, см. ссылку.
Факториал-Википедия[^]
Совет: забудьте этот пример, он явно неправильный и нуждается в полном переписывании. Если вам интересно, вы найдете много примеров с Google.

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

CPallini

Вы действительно должны прочитать книгу или учебник, прежде чем публиковать такие основные вопросы.
В любом случае, factorial это функция, в любое время, когда он вызывается с помощью int аргумент, он возвращает int результат.
Он должен вернуть факторный[^] числа. Однако опубликованный вами код имеет логический изъян (он путается с аргументом функции), а также синтаксические ошибки (запятые вместо семколонов в for пункт).
Вы могли бы написать это следующим образом:

int factorial(int x)
{
  int f=1;
  int n;
  for (n=2; n<=x; n++)
    f = f * n; // is the same of 'f *= n;'
  return f;
}


Факториал 5 по определению, это 5*4*3*2*1=120 и функция должна его вернуть. Таким образом, вы можете проверить код следующим образом main функция
int main()
{
  printf("factorial of %d is %d\n", 5, factorial(5));
  return 0;
}


Patrice T

Привет,
Я думаю, что трудность понять этот пример заключается в том, что код, о котором идет речь, неверен.