|
|
Регистрация | << Правила форума >> | 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. Дальше - переполнение. Зато расчет абсолютно точный. |