Язык Си в примерах/Факториал: различия между версиями
Содержимое удалено Содержимое добавлено
Уточнения; →Вариант «произвольный»: новый раздел. |
DannyS712 (обсуждение | вклад) м <source> -> <syntaxhighlight> (phab:T237267) |
||
Строка 10:
{{Якорь |factorial.c}}
<
#include <stdio.h>
Строка 28:
return 0;
}
</syntaxhighlight>
Определение функции <code >factorial</code> выше основано на следующей ''рекуррентной''
Строка 37:
Для вычисления факториала <var >n</var>! эта функция вызывает саму себя с аргументом <var >n</var> − 1.
Тернарный оператор (<code >? :</code>) в выражении <
функция <code >factorial</code> постоянно бы вызывала саму себя, и во
время выполнения программы мы получили бы сообщение об ошибке
Строка 60:
<strong >Обратите внимание</strong>, что в этом примере мы не приводим ни определения функции <code >main</code>, ни ''директив препроцессора'' <code >#include</code> подключения используемых нами ''заголовков'' — их следует заимствовать из [[#factorial.c |предыдущего примера.]]
<
static int
factorial_1 (int n, int p)
Строка 72:
return factorial_1 (n, 1);
}
</syntaxhighlight>
== Явно итеративный вариант ==
Строка 78:
Наконец, в варианте ниже мы вовсе исключим рекурсию из определения функции <code >factorial</code>, явно сведя ее к итерации.
<
static int
factorial (int n)
Строка 87:
return r;
}
</syntaxhighlight>
В отличие от [[#Реализация рекуррентной формулы |первого варианта]] (но аналогично варианту [[#Использование хвостовой рекурсии |с хвостовой рекурсией]]) в данном примере нам потребовалась дополнительная локальная переменная. В случае «нехвостовой» рекурсии — роль такой переменной фактически играет растущий ''стек возврата.'' Отметим, впрочем, что в данной конкретной задаче это не столь важно.
Строка 98:
{{Якорь |fact-imp.c}}
<
#include <stdio.h>
#include <gmp.h>
Строка 122:
return 0;
}
</syntaxhighlight>
== Задания ==
|