Обчислення факторіалу Free Pascal

У більшості книг з програмування як приклад рекурсивної функції демонструється програма обчислення факторіалу, текст якої виглядає досить компактно:

function fact(n:integer):extended; begin

якщо n=0 then Result:=1 else Result:=n*fact(n-1);

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

Листинг 9.1 2 . Програма обчислення факторіалу

n: integer; Res: tip;

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

І спробуємо змінювати тип значення, що повертається, щоб визначити межу застосування нашої функції для типів integer, comp, double, extended. Виявляється, що при tip=integer наша функція правильно рахує до n=12 і видає без повідомлення про помилку наступне:

Але за відключеному контролі видає неправильне значення 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

для i:=2 до n до Result:=Result*i;

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