Язык Си в примерах/Факториал: различия между версиями

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