The factorial function can be defined in both recursive and iterative ways. Take a look at the following definitions borrowed from Wikipedia.
Recursive Definition
Iterative Definition
For both the above definitions, we have that:
The purpose here is not the mathematical stuff, but to provide the implementation of such definitions in Delphi (Object Pascal).
First, I bring you one recursive implementation of the factorial function. Notice how the function calls itself, which is what the recursion really is:
function Factorial(aNumber: Integer): Integer; begin if aNumber < 0 then raise Exception.Create('The factorial function is not defined for negative integers.'); Result:= 1; if aNumber > 0 then Result:= Factorial(aNumber-1) * aNumber; end;
Second, I present you one iterative implementation of the factorial function. You can easily see the iteration performed in the “for
” loop below:
function Factorial(aNumber: Integer): Integer; var i: Integer; begin if aNumber < 0 then raise Exception.Create('The factorial function is not defined for negative integers.'); Result:= 1; for i:=1 to aNumber do Result:= Result * i; end;
Big-O Considerations
The recursive factorial function implemented before has a linear growth O(n), not O (n!). In addition, the iterative factorial function is also linear O(n).
2 / 2 / 0 Регистрация: 31.03.2010 Сообщений: 37 |
|
1 |
|
11.04.2010, 16:18. Показов 28300. Ответов 3
как посчитать факториал в delphi? к примеру K!
0 |
Ztrel 507 / 226 / 42 Регистрация: 14.11.2009 Сообщений: 371 |
||||
11.04.2010, 16:33 |
2 |
|||
Все просто. Если я помню, факториал это: n! = 1*2*3*4*5…*n Ну, тогда
Писал для консоли.
2 |
2 / 2 / 0 Регистрация: 31.03.2010 Сообщений: 37 |
|
11.04.2010, 16:49 [ТС] |
3 |
спасибо)
0 |
507 / 226 / 42 Регистрация: 14.11.2009 Сообщений: 371 |
|
11.04.2010, 16:56 |
4 |
Всегда пожалуйста
1 |
Рекурсивным называется объект, частично состоящий или определяемый с помощью самого себя.
Факториал — это классический пример рекурсивного объекта.
Факториал числа n — это произведение целых чисел от 1 до n. Обозначается факториал числа п так: n…
Согласно определению
n! =
1
х
2
х
3
х ... х (n -
1
) х n.
Приведенное выражение можно переписать так:
n! = n х ((n -
1
) х (n -
2
) х ...х
3
х
2
х
1
) =nx(n -
1
)!
То есть, факториал числа п равен произведению числа п на факториал числа (n – 1). В свою очередь, факториал числа (n – 1) — это произведение числа (n – 1) на факториал числа (n – 2) и т. д.
Таким образом, если вычисление факториала п реализовать как функцию, то в теле этой функции будет инструкция вызова функции вычисления факториала числа (n – 1), т. е. функция будет вызывать сама себя. Такой способ вызова называется рекурсией, а функция, которая обращается сама к себе, называется рекурсивной функцией. В листинге 12.1 приведена рекурсивная функция вычисления факториала.
Листинг 12.1. Рекурсивная функция вычисления факториала
Обратите внимание, что функция вызывает сама себя только в том случае, если значение полученного параметра k не равно единице. Если значение параметра равно единице, то функция сама себя не вызывает, а возвращает значение, и рекурсивный процесс завершается.
На рис. 12.1 приведен вид диалогового окна программы, которая для вычисления факториала числа использует рекурсивную функцию factorial. Текст программы приведен в листинге 12.2.
Рис. 12.1. Окно программы вычисления факториала
Листинг 12.2. Использование рекурсивной функции
На рис. 12.2 приведены два диалоговых окна. Результат вычисления факториала, представленный на рис. 12.2, а, соответствует ожидаемому.
Рис. 12.2. Примеры работы программы вычисления факториала
a)
б)
Результат, представленный на рис. 12.2, 5, не соответствует ожидаемому. Факториал числа 44 равен нулю! Произошло это потому, что факториал числа 44 настолько велик, что превысил максимальное значение для переменной типа integer, и, как говорят программисты, произошло переполнение с потерей значения.
Delphi может включить в исполняемую программу инструкции контроля диапазона значений переменных. Чтобы инструкции контроля были добавлены в программу, нужно во вкладке Compiler диалогового окна Project Options (рис. 12.3) установить флажок Overflow checking (Контроль переполнения), который находится в группе Runtime errors (Ошибки времени выполнения).
Рис. 12.3. Вкладка Compiler диалогового окна Project Options
Помоги проекту! Расскажи друзьям об этом сайте:
Рекурсивным называется объект, частично состоящий или определяемый с помощью самого себя. Факториал — это классический пример рекурсивного объекта. Факториал числа n — это произведение целых чисел от 1 до n. Обозначается факториал числа п так: n…
Согласно определению:
n! = 1 х 2 х 3 х … х (n — 1) х n.
Приведенное выражение можно переписать так:
n! = n х ((n — 1) х (n — 2) х …х 3 х 2 х 1) =nx(n — 1)!
То есть, факториал числа п равен произведению числа п на факториал числа (n — 1). В свою очередь, факториал числа (n — 1) — это произведение числа (n — 1) на факториал числа (n — 2) и т. д.
Таким образом, если вычисление факториала п реализовать как функцию, то в теле этой функции будет инструкция вызова функции вычисления факториала числа (n — 1), т. е. функция будет вызывать сама себя. Такой способ вызова называется рекурсией, а функция, которая обращается сама к себе, называется рекурсивной функцией.
function factorial(n: integer): integer; begin if n > 1 then factorial:=n * factorial(n-1) // функция вызывает сама себя else factorial := 1; // рекурсивный процесс закончен end;
Обратите внимание, что функция вызывает сама себя только в том случае, если значение полученного параметра k не равно единице. Если значение параметра равно единице, то функция сама себя не вызывает, а возвращает значение, и рекурсивный процесс завершается.
Использование рекурсивной функции
unit factor_,- interface Windows, Messages, SysDtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForml = class(TFbrm) Labell: TLabel; Editl: TEdit; Buttonl: TButton; Label2: TLabel; procedure ButtonlClicklSender: TObject); private {Private declarations } public { Public declarations } end; var Form1: TForm; implementation {SR ‘.DFM) // рекурсивная функция function factorial(n: integer): integer; begin if n > 1then factorial := n * factorial(n-1) // функция вызывает сама себя else factorial:= 1; // факториал 1 равен 1 end; 27.procedure TForml.ButtonlClick(Sender: TObject); k:integer; // число, факториал которого мало вычислить fiinteger; // значение факториала числа k begin k := StrToInt(Editl.Text); f := factorial(k); label2.сарtion: = ‘Факториал числа ‘+Edit1.Text+’ равен ‘+IntToStr(f);end; end.