Обчислення факторіалу 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 — (ІІІКТ)