Advertisement
HEX0x29A

Fibonacci

Jan 7th, 2015
540
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.88 KB | None | 0 0
  1. type
  2.   //Тип функции обратного вызова генератора чисел фибоначчи
  3.   TFibonacciCallback = procedure (Number: int64);
  4.  
  5. //Функция генерации чисел фибоначчи
  6. function GetFibonacciNumbers(Count: int64; Callback: TFibonacciCallback): BOOL;
  7. var
  8.   Number0  : int64; //Число фибоначчи с индексом N-1
  9.   Number1  : int64; //Число фибоначчи с индексом N
  10.   NewNumber: int64; //Текущее число фибоначчи
  11. begin
  12.   //Если кол-во больше двух(первые 2 изначально известны)
  13.   //и функция обратного вызова задана
  14.   if (Count > 2) and (@Callback <> nil) then
  15.   try
  16.     Number0 := 0; //Задаём первое число фибоначчи
  17.     Number1 := 1; //Задаём второе число фибоначчи
  18.     Callback(0);  //Возвращаем первое число
  19.     Callback(1);  //Возвращаем второе число
  20.     Dec(Count, 2); //Уменьшаем кол-во чисел, т.к. два уже вернули
  21.     repeat //Запускаем цикл вычисления чисел фибоначчи
  22.       //Проверка переполнения значения int64 (переполнение вызовет 94 число)
  23.       if ((Number0 + Number1) < Number0) or ((Number0 + Number1) < Number1) then
  24.       begin
  25.         Result := False; //Возвращаем что выполнено с ошибкой
  26.         Exit; //Выходим из функции
  27.       end;
  28.       //Получаем текущее число фибоначчи путём сложения двух предыдущих
  29.       NewNumber := Number0 + Number1;
  30.       //Задаём переменной значение следующего за ней числа
  31.       Number0 := Number1;
  32.       //Задаём переменной значение текущего числа фибоначчи
  33.       Number1 := NewNumber;
  34.       //Уменьшаем кол-во чисел
  35.       Dec(Count);
  36.       //Возвращаем текущее число фибоначчи
  37.       Callback(NewNumber);
  38.     until Count = 0; //Завершаем цикл, если кол-во чисел равно нулю
  39.     //Возвращаем что выполнено без ошибок
  40.     Result := True;
  41.   except
  42.     //Возвращаем что выполнено с ошибкой
  43.     Result := False;
  44.   end
  45.   else //Если кол-во меньше или равно двум или функция обратного вызова задана
  46.     if (@Callback <> nil) then //Если функция обратного вызова задана
  47.     case Count of
  48.       1: Callback(0); //Если кол-во 1, то возвращаем первое число
  49.       2: //Если кол-во 2, то возвращаем два первых числа
  50.         begin
  51.           Callback(0);  //Возвращаем первое число
  52.           Callback(1);  //Возвращаем второе число
  53.         end;
  54.       else
  55.         //Возвращаем что выполнено с ошибкой
  56.         Result := False;
  57.     end else
  58.       //Возвращаем что выполнено с ошибкой
  59.       Result := False;
  60. end;
  61.  
  62. //Функция обратного вызова
  63. procedure FibonacciCallback(Number: int64);
  64. begin
  65.   //Добавление числа фибоначчи в Memo1
  66.   Form1.Memo1.Lines.Add(IntToStr(Number));
  67. end;
  68.  
  69. procedure TForm1.Button1Click(Sender: TObject);
  70. begin
  71.   //Очистка Memo1 для последующего использования
  72.   Memo1.Clear;
  73.   //Запуск генератора чисел фибоначчи
  74.   if not GetFibonacciNumbers(StrToIntDef(Edit1.Text, 0), FibonacciCallback) then
  75.     ShowMessage('Ошибка');
  76. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement