Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/55: Рейтинг темы: голосов - 55, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 14.06.2010
Сообщений: 14
1

Вычисление факториала рекурсивным методом

22.11.2011, 21:02. Показов 11161. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
помогите написать на лазарусе вычисление N! рекурсивным методом с использованием Edit,Label и Button. Заранее благодарна!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2011, 21:02
Ответы с готовыми решениями:

Программирование циклических алгоритмов: вычисление факториала
Дано натуральное число n.Найти n факториал.Вывести результат на форуме

Вычисление значения функции рекурсивным методом
Вычислить значение функции Х(n) при заданном значении n, используя рекурсию. ВНИМАНИЕ! Знаки...

Вычисление рекурсивным методом значение математической зависимости
Вычислить рекурсивным методом значение математической зависимости, заданной рекуррентной формулой,...

Вычислить рекурсивным методом
Добрый день! Прошу вашей помощи. Вычислить рекурсивным методом y =x**N за следующим алгоритмом: ...

7
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
22.11.2011, 23:12 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
type
  EFactorialError = class(Exception)
  end;
 
var
  Form1: TForm1;
 
implementation
 
//------------
function Factorial(n: integer): integer;
begin
  if n = 0 then Exit(1)
  else if n > 0 then Exit(n * Factorial(n - 1))
  else raise EFactorialError.Create('"n" must be non-negative');
end;
 
//------------
function FactorialFromStr(const n: AnsiString): AnsiString;
var
  val: integer;
begin
  val:= StrToInt(n);
  Exit( IntToStr(Factorial(val)) );
end;
 
{ TForm1 }
 
//------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Label1.Caption:= 'Result: ' + FactorialFromStr(Edit1.Text);
  except
    on e: Exception do
      ShowMessage(e.Message);
  end;
end;
 
initialization
  {$I unit1.lrs}
 
end.
1
0 / 0 / 0
Регистрация: 14.06.2010
Сообщений: 14
24.11.2011, 10:10  [ТС] 3
ОГРОМНЕЙШЕЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБИЩЕ)

Добавлено через 13 часов 31 минуту
rangerx, всё работает отлично, а почему 17! уже отрицательные числа?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
24.11.2011, 14:04 4
Потому что значение 17!(355687428096000) не вмещается в переменную типа integer. Уже при 13! происходит переполнение. Можете сделать дополнительную проверку на максимально допустимое значение передаваемое функции. Вообще, в реальных программах для вычисления факториала простые типы данных не используются, вместо них применяются т.н. "длинные числа". И естественно никакой рекурсии. Рекурсия полезная вещь, но не для этой задачи
1
0 / 0 / 0
Регистрация: 14.06.2010
Сообщений: 14
24.11.2011, 21:24  [ТС] 5
rangerx, с этим я почти справилась)))нужно просто чтобы при вводе числа больше 16 он писал "нельзя посчитать" и нужна точно такая же прога токо с итерацией теперь чтобы сравнить какой способ быстрее и сколько памяти занимает))

Добавлено через 5 минут
а ещё я поменяла integer на int64 и он почему то считатет все до 20!, 21и 22! не считает, 23!,24 считатет а 25 опять нет))) потом 31...33-39 ситате с 40-41 опять нет))
0
438 / 367 / 132
Регистрация: 09.09.2011
Сообщений: 1,334
24.11.2011, 23:15 6
Используйте QWord вместо int64 - тогда минусов не будет.

максимальное положительное число для int64 - 9223372036854775807
для QWord - 18446744073709551615 (20 разрядов)

25! = 15511210043330985984000000 (26 разрядов)

соответственно максимальное значение которое влезет в QWord - 20! = 2432902008176640000, всё что больше -переполнение.

если нужно больше, то нужно реализовывать "длинную" арифметику, либо использовать дополнительные библиотеки.

Добавлено через 11 минут
Итеративный вариант очевидно можно запрограммировать так:
Pascal
1
2
3
4
5
6
7
8
function Factorial(n: integer): integer;
begin
   Result: = n;
   while n > 1 do begin
      Result * (n -1);
      dec(n);
   end;
end;
сюда нужно добавить проверку на допустимые значения n.
1
0 / 0 / 0
Регистрация: 14.06.2010
Сообщений: 14
25.11.2011, 10:00  [ТС] 7
чё то ничего не получается(((он у меня то ошибки выдаёт то вообще закрывается и всё
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
26.11.2011, 23:25 8
чё то ничего не получается(((он у меня то ошибки выдаёт то вообще закрывается и всё
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
function Factorial(n: integer): integer;
begin
  if n < 0 then raise EFactorialError.Create('"n" must be non-negative');
  if n = 0 then Exit(1);
 
  Result:= 1;
  while n > 1 do
  begin
    Result:= Result * n;
    Dec(n);
  end;
end;
Добавлено через 25 минут
а ещё я поменяла integer на int64 и он почему то считатет все до 20!, 21и 22! не считает, 23!,24 считатет а 25 опять нет))) потом 31...33-39 ситате с 40-41 опять нет))
Максимальное зачение, которое может храниться в переменной типа int64 это 9223372036854775807. 20!(2432902008176640000) не превышает это значение. А вот 21!(51090942171709440000) в переменную типа int64 уже не поместится. Следовательно максимальное значение для int64 = 20!.
1
26.11.2011, 23:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2011, 23:25
Помогаю со студенческими работами здесь

Решение рекурсивным методом
Доброго времени суток.Помогите разработать рекурсивный метод для вот этой формулы. ...

Факториал рекурсивным методом
Добрый день! Хотела спросить , почему когда ставлю 4 выводит 24 , а не 12 using System; using...

Вычисление степени числа рекурсивным вызовом
По условию задачи написал код #include&lt;iostream&gt; using namespace std; #include&lt;windows&gt;

Среднее арифметическое рекурсивным методом
Требуется найти среднее арифметическое последовательности чисел (def avg(*mas)), не используя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru