Как в делфи найти факториал

The factorial function can be defined in both recursive and iterative ways. Take a look at the following definitions borrowed from Wikipedia.

Recursive Definition

Factorial Recursive definition

Iterative Definition

Factorial Iterative Definition

For both the above definitions, we have that:

Zero Factorial

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

Ну, тогда

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
k, s, i: integer;
begin
writeln ('Vvedite chislo');
readln(k); // ввели число, факториал которого надо посчитать.
 
s:= 1; // это у нас переменная для результата.
 
for i:= 1 to k do
s:= s*i;
 
writeln('s =  ', s); // вывод результата.
readln;
 
end.

Писал для консоли.



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. Окно программы вычисления факториала

 Рекурсия в Delphi: Факториал

Листинг 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Рекурсия в Delphi: Факториал

Помоги проекту! Расскажи друзьям об этом сайте:

Рекурсивным называется объект, частично состоящий или определяемый с помощью самого себя. Факториал — это классический пример рекурсивного объекта. Факториал числа 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.

Добавить комментарий