Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Исходники и статьи
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.09.2009, 03:42
JIbIC9ILLIKA JIbIC9ILLIKA вне форума
Прохожий
 
Регистрация: 14.09.2009
Сообщения: 1
Репутация: 10
Печаль программа по расчету числа Фибоначчи

Вот такая проблемка возникла. Нужна программа по расчету числа Фибоначчи.

Может кто-нибудь подсказать, в чем тут ошибка?
Код:
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    editN: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    editFib: TEdit;
    Button1: TButton;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
  private

    function Fibona44i (n: byte): double;
  public

  end;
 
var
  Form1: TForm1;
 
implementation
 

function TForm1.Fibona44i(n: byte): double;
begin
  if ((n=1)or(n=2)) then
    Result := 1
  else
    // двойной рекурсивный вызов:
    // память расходуется катастрофически
    Result := Fibona44i(n-1)+Fibona44i(n-2);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  n: byte;
begin
  try
    n := StrToInt(editN.Text);
  except
    MessageDlg('От 0 до 255',
      mtError, [mbOK], 0);
  end;
  editFib.Text := FloatToStrF(Fibona44i(n),ffGeneral,6,0);
end;
 
end.
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 14.09.2009 в 10:27.
Ответить с цитированием
  #2  
Старый 14.09.2009, 14:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А что неправильно-то?
Ну есть некоторые помарки, которые при неверных входных данных дадут косяк. Но по сути все правильно.
Вот ошибки:
1. Число Фибоначчи для 0 и отрицательных чисел не определено. Проверки на это нет.
2. В принципе, для увеличения быстродействия при нескольких запусках можно использовать процедуру с памятью.
3. В процедуре вызове вне зависимости от того, произошла ошибка при преобразовании или нет, запускается расчет. Надо внести запуск расчета внутрь секции Try.
4. Для расчета числа фибоначи большого порядкового номера лучше использовать тип Int64 - таки там данных поболее помещается. А тип с плавающей точкой все-таки нужен для ну очень больших чисел.
Ответить с цитированием
  #3  
Старый 14.09.2009, 14:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Кстати, вот функция расчета чисел фибоначи с памятью:
Код:
var
  Fibs : Array Of Int64;

function Fib(N : Int64) : Int64;
begin
  If N < 1 Then Raise Exception.Create('Fib: N не может быть < 1.');
  If N < 3
    Then Result := 1
    Else
      Begin
        If Length(Fibs) >= N
          Then Result := Fibs[N-1]
          Else Result := Fib(N-1) + Fib(N-2);
      End;
  If N = Length(Fibs) + 1 Then
    Begin
      SetLength(Fibs,N);
      Fibs[N-1] := Result;
    End;
end;

initialization
  SetLength(Fibs,0);

finalization
  SetLength(Fibs,0);

Считает до N = 92. Дальше - переполнение. Зато расчет абсолютно точный.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter