Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type
- //Тип функции обратного вызова генератора чисел фибоначчи
- TFibonacciCallback = procedure (Number: int64);
- //Функция генерации чисел фибоначчи
- function GetFibonacciNumbers(Count: int64; Callback: TFibonacciCallback): BOOL;
- var
- Number0 : int64; //Число фибоначчи с индексом N-1
- Number1 : int64; //Число фибоначчи с индексом N
- NewNumber: int64; //Текущее число фибоначчи
- begin
- //Если кол-во больше двух(первые 2 изначально известны)
- //и функция обратного вызова задана
- if (Count > 2) and (@Callback <> nil) then
- try
- Number0 := 0; //Задаём первое число фибоначчи
- Number1 := 1; //Задаём второе число фибоначчи
- Callback(0); //Возвращаем первое число
- Callback(1); //Возвращаем второе число
- Dec(Count, 2); //Уменьшаем кол-во чисел, т.к. два уже вернули
- repeat //Запускаем цикл вычисления чисел фибоначчи
- //Проверка переполнения значения int64 (переполнение вызовет 94 число)
- if ((Number0 + Number1) < Number0) or ((Number0 + Number1) < Number1) then
- begin
- Result := False; //Возвращаем что выполнено с ошибкой
- Exit; //Выходим из функции
- end;
- //Получаем текущее число фибоначчи путём сложения двух предыдущих
- NewNumber := Number0 + Number1;
- //Задаём переменной значение следующего за ней числа
- Number0 := Number1;
- //Задаём переменной значение текущего числа фибоначчи
- Number1 := NewNumber;
- //Уменьшаем кол-во чисел
- Dec(Count);
- //Возвращаем текущее число фибоначчи
- Callback(NewNumber);
- until Count = 0; //Завершаем цикл, если кол-во чисел равно нулю
- //Возвращаем что выполнено без ошибок
- Result := True;
- except
- //Возвращаем что выполнено с ошибкой
- Result := False;
- end
- else //Если кол-во меньше или равно двум или функция обратного вызова задана
- if (@Callback <> nil) then //Если функция обратного вызова задана
- case Count of
- 1: Callback(0); //Если кол-во 1, то возвращаем первое число
- 2: //Если кол-во 2, то возвращаем два первых числа
- begin
- Callback(0); //Возвращаем первое число
- Callback(1); //Возвращаем второе число
- end;
- else
- //Возвращаем что выполнено с ошибкой
- Result := False;
- end else
- //Возвращаем что выполнено с ошибкой
- Result := False;
- end;
- //Функция обратного вызова
- procedure FibonacciCallback(Number: int64);
- begin
- //Добавление числа фибоначчи в Memo1
- Form1.Memo1.Lines.Add(IntToStr(Number));
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- //Очистка Memo1 для последующего использования
- Memo1.Clear;
- //Запуск генератора чисел фибоначчи
- if not GetFibonacciNumbers(StrToIntDef(Edit1.Text, 0), FibonacciCallback) then
- ShowMessage('Ошибка');
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement