Главная » Free Pascal » Вычисление факториала Free Pascal

0

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

function fact(n:integer):extended; begin

if n=0 then Result:=1 else Result:=n*fact(n-1);

end;

Включим эту функцию в следующую головную программу (листинг 9.12).

   Листинг 9 .1 2 .  Программа  вычисления  факториала                                                                    

program factorial;

{$R-}

var

n: integer; Res: tip;

function fact(n:integer):extended;

begin

repeat

readln(n); Res:=round(fact(n)); writeln(n,’! = ‘,Res);

until EOF; end.

И попробуем менять тип возвращаемого значения, чтобы определить границу применимости нашей функции для типов integer, comp, double, extended. Оказы- вается, что при tip=integer наша функция правильно считает до n=12 и выдает без сообщения об ошибке следующее:

12! = 470001600

Но  при  отключенном  контроле  выдает  неверное  значение  13!=1932053504

(вместо 6227020800). А для n=17 результат вообще отрицательный (-288522240).

При tip=comp удается добраться до 20!, на 21! фиксируется переполнение. При tip=double последний правильный результат выдается для 170!. Наконец, при tip=extended удается вычислить 1754!. При больших значениях n для каждого из приведенных типов возвращаемого значения фиксируется аварийный останов.

Функция вычисления факториала довольно просто заменяется обычным цик- лом, который работает существенно быстрее и не требует дополнительных затрат по памяти (листинг 9.13).

   Листинг 9 .1 3 .  Функ ция  вычисления  факториала  без  рекурсии                                                

function fact1(n:integer):extended; var

i: integer; begin

Result:=1;

for i:=2 to n do Result:=Result*i;

end;

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии