Безплатно факторно изчисление на Pascal

В повечето книги по програмиране факторна програма е показана като пример за рекурсивна функция, чийто текст изглежда доста компактен:

функция fact(n:integer):extended; започвам

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

Нека включим тази функция в следната основна програма (списък 9.12).

Списък 9 .1 2 . Факторна програма

n: цяло число Res: върха;

четене(n); Res:=кръг(факт(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 . Функция за изчисляване на факториел без рекурсия

функция fact1(n:integer):extended; вар

i: цяло число; започвам

за i:=2 до n направи Резултат:=Резултат*i;

Източник: Кетков, Ю. Л., Свободен софтуер. БЕЗПЛАТЕН PASCAL за студенти и ученици, Ю. Л. Кетков, А. Ю. Кетков. - Санкт Петербург: BHV-Петербург, 2011. - 384 с.:аз ще. + CD-ROM - (IIIKT)