Другие языки программирования и технологии

Помогите разобрать код программы чисел Фибоначчи на Delphi

Ну и в чем проблема
Числа Фибоначчи
f1=0 f2=1 f3=1 ...f(n)=f(n-1)+f(n-2)

Определяем какой член последовательности нужен
n:=strtoint(Vvod.text);
В цикле
fib:=текущее число (x1+x2)
подготавливаем следущую итерацию
x1:=x2
x2=fib
Повторяем до получения n-члена
Выводим ответ
res.caption:='Результат: '+ inttostr(fib);

PS только правильнее результат не в цикле выводить а после получения результата
Marat Jumakulyyev
Marat Jumakulyyev
91 266
Лучший ответ
Это лучше заюзай. Всё что только можно расписал:

type
 //Тип функции обратного вызова генератора чисел фибоначчи
 TFibonacciCallback = procedure (Number: DWORD);

//Функция генерации чисел фибоначчи
function GetFibonacciNumbers(Count: DWORD; Callback: TFibonacciCallback): BOOL;
var
 Number0 : DWORD; //Число фибоначчи с индексом N-1
 Number1 : DWORD; //Число фибоначчи с индексом N
 NewNumber: DWORD; //Текущее число фибоначчи
begin
 //Если кол-во больше двух (первые 2 изначально известны)
 //и функция обратного вызова задана
 if (Count > 2)and(@Callback <> nil) then
 try
  Number0 := 0; //Задаём первое число фибоначчи
  Number1 := 1; //Задаём второе число фибоначчи
  Callback(0); //Возвращаем первое число
  Callback(1); //Возвращаем второе число
  Dec(Count, 2); //Уменьшаем кол-во чисел, т. к. два уже вернули
  repeat //Запускаем цикл вычисления чисел фибоначчи
   //Проверка переполнения значения DWORD (переполнение вызовет 49 число)
   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: DWORD);
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;
Антон Трещалов
Антон Трещалов
50 288
Валентин Шопов О Боже, нихрена себе....))) спасибо конечно, но мне нужно понять именно свой код. У меня итак есть несколько решений задачи, не считая предложенную мной) Однако, в случае необходимости, буду обращаться к вашему коду)) Не пропадать же добру зря, тем более такому подробному))
Отладчиком в ИДЕ прогони, если лень три строчки на листке бумаги написать!
Валентин Шопов Писать я еще не разучился, вопрос был в "разборе"! Мне не понятен принцип вычисления здесь.
если не понимаешь как ОНО работает то откуда уверенность что нашёл нужное?

да еще и приводишь процедуру а не прогу))
система ни разу не равна своему кусочку))
Perman L_P.e.o
Perman L_P.e.o
27 060
Валентин Шопов А что мне еще показывать, если больше ничего и нету. Или вам нужно форму показать?? Работает правильно, потому что тестил...