![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Вот такая проблемка возникла. Нужна программа по расчету числа Фибоначчи.
Может кто-нибудь подсказать, в чем тут ошибка? Код:
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, 14.09.2009 в 10:27. |
|
#2
|
|||
|
|||
|
А что неправильно-то?
Ну есть некоторые помарки, которые при неверных входных данных дадут косяк. Но по сути все правильно. Вот ошибки: 1. Число Фибоначчи для 0 и отрицательных чисел не определено. Проверки на это нет. 2. В принципе, для увеличения быстродействия при нескольких запусках можно использовать процедуру с памятью. 3. В процедуре вызове вне зависимости от того, произошла ошибка при преобразовании или нет, запускается расчет. Надо внести запуск расчета внутрь секции Try. 4. Для расчета числа фибоначи большого порядкового номера лучше использовать тип Int64 - таки там данных поболее помещается. А тип с плавающей точкой все-таки нужен для ну очень больших чисел. |
|
#3
|
|||
|
|||
|
Кстати, вот функция расчета чисел фибоначи с памятью:
Код:
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. Дальше - переполнение. Зато расчет абсолютно точный. |