Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Последовательность Фиббоначи


Фиббоначи ©   (2006-10-01 15:29:00) 

Привет всем!
Пожалуйста помогите придумать алгоритм для проги на Паскале, я уже часа 2 маюсь не могу придумать.Вообщем есть такая последоватьльность где каждый последующий член равен сумме двух предыдущих
1   2   3   5   8   13   21   34   55...
Задача: написать программу для нахождения первых N чисел Фибоначчи. N вводится с клавиатуры.


Думкин   (2006-10-02 06:32:00) [1]

> Real ©   (01.10.06 22:51) [13]
> Блин он же алгоритм просил! Еще в одном убили тягу к знаниям.
> ..


>> Фиббоначи   (01.10.06 15:29)  
>  я уже часа 2 маюсь не могу придумать


Мне кажется, там убивать просто уже нечего. :(


Real   (2006-10-01 23:21:00) [2]

не, алгоритм и код вещи разные, особенно в контексте ветки для начинающих


Zeqfreed   (2006-10-01 22:59:00) [3]

> [13] Real ©   (01.10.06 22:51)

Да для такой задачи алгоритм придумывать даже не серьезно как-то :) Тем более я уверен, что под алгоритмом подразумевался код :)


Real   (2006-10-01 22:51:00) [4]

Блин он же алгоритм просил! Еще в одном убили тягу к знаниям... теперь будет для всего подряд клянчить готовые решения...


X9   (2006-10-01 18:18:00) [5]

> [11] Zeqfreed ©   (01.10.06 17:59)

Я в курсе, это просто пример.
Вот чуть более защищённый код:

program Fibonacci;

uses
 Crt;

function NthFibonacciNumber(const N: Integer): Longint;
begin
 if (N in [1, 2]) then
   NthFibonacciNumber := N
 else
   NthFibonacciNumber := NthFibonacciNumber(N - 1) + NthFibonacciNumber(N - 2);
end;

const
 Max = 30;

var
 I, N: Word;
 E: Integer;
 S: string[10];
 V: Boolean;

begin
 N := 0;
 repeat
   V := True;
   ClrScr;
   Write('Введите N: ');
   ReadLn(S);
   Val(S, N, E);
   if (N > Max) or (E <> 0) then
   begin
    WriteLn(#13#10'Неправильно введены данные. Нажмите Enter для повторного ввода.');
     ReadLn;
    V := False;
   end;
 until V;
 WriteLn;
 for I := 1 to N do
 begin
   Write(NthFibonacciNumber(I), ' ');
if I mod 10 = 0 then
   WriteLn;
 end;
 WriteLn(#13#10'Выведен ряд Фибоначи по ', N, ' элемент.');
 ReadLn;
end.


Zeqfreed   (2006-10-01 17:59:00) [6]

> [10] X9 ©   (01.10.06 17:57)

Код не дуракоустойчивый ;) Нет проверки вводимых значений.


X9   (2006-10-01 17:57:00) [7]

Вот код немного переработынный код [7] Zeqfreed © (01.10.06 16:31), специально для TurboPascal:

program Fibonacci;

uses
 Crt;

function NthFibonacciNumber(const N: Integer): Integer;
begin
 if (N in [1, 2]) then
   NthFibonacciNumber := N
 else
   NthFibonacciNumber := NthFibonacciNumber(N - 1) + NthFibonacciNumber(N - 2);
end;

var
 I, N: Word;

begin
 ClrScr;
 Write('‚ўҐ¤ЁвҐ N: ');
 ReadLn(N);
 WriteLn;
 for I := 1 to N do
 begin
   Write(NthFibonacciNumber(I), ' ');
   if I mod 10 = 0 then
    WriteLn;
 end;
 ReadLn;
end.


Вывод на экран осуществляется не слишком красиво, но для примера сойдёт.


Zeqfreed   (2006-10-01 16:49:00) [8]

function NthFibonacciNumber_NonRecursive(const N : Integer) : Integer;
var
 Nums : array[-2..0] of Integer;
 i : Integer;
begin
 if (N in [1, 2]) then
  Result := N
 else begin
  Nums[-2] := 1;
  Nums[-1] := 2;

  for i := 3 to N do begin
   Nums[0] := Nums[-1] + Nums[-2];
   Nums[-2] := Nums[-1];
   Nums[-1] := Nums[0];
  end;

  Result := Nums[0];
 end;
end;


Вот вам ещё нерекурсивный вариант :)


Проггер из библиотеки   (2006-10-01 16:33:00) [9]

Кстати, [7] - вообще красивое решение, через рекурсию. Рекомендую разобраться и вникнуть в суть...


vidiv   (2006-10-01 16:31:00) [10]

function fib(i:integer):integer;
begin
if i<3 then
fib:=1
else
fib := fib(i-1)+fib(i-2);
end;
var k:integer;
begin
readln(k);
writeln(fib(k));
end;


Zeqfreed   (2006-10-01 16:31:00) [11]

function NthFibonacciNumber(const N : Integer) : Integer;
begin
 if (N in [1, 2]) then
  Result := N
 else
  Result := NthFibonacciNumber(N - 1) + NthFibonacciNumber(N - 2);
end;


И не мудрить.


Проггер из библиотеки   (2006-10-01 16:29:00) [12]

> [3]
Типа, на Turbo Pascal?

Тогда так:

const
N=50;

var
Nums:array [1..N] of Integer;

procedure Fib;
var
i,N:Integer;
Prev1,Prev2:Integer; {Последние 2 числа}
begin
Nums[1]:=1; Nums[2]:=1; Prev1:=1; Prev2:=1; {Первые два числа}
Position:=3; {Начнёмс третьего}
for i:=3 to N do {С третьего, т.к. 2 уже получили}
begin
 Nums[i]:=Prev1+Prev2;
 Prev1:=Prev2; Prev2:=Nums[i];
end;
end;


Даже короче получилось...


Percent   (2006-10-01 16:28:00) [13]

const
 N = 10;
var
 i: integer;
 iCurr: integer;
 iPrev: integer;
 iAdd: integer;
begin
 iCurr := 1;
 iPrev := 1;
 for i := 1 to N do
 begin
   writeln(iCurr);
   iAdd := iCurr;
   iCurr := iPrev + iCurr;
   iPrev := iAdd;
 end;
end.


Фиббоначи   (2006-10-01 16:19:00) [14]

Вы наверно не поняли, мне нужно написать программу на Паскале, а не на Delphi


Проггер из библиотеки   (2006-10-01 16:13:00) [15]

> [0]

procedure Fib(N:Integer);
var
i,N:Integer;
Prev1,Prev2:Integer; {Последние 2 числа}
Curr:Integer; {Текущее число}
Tmp:TStringList; {Вместо этого можно использовать что-нибудь ещё}
begin
Tmp:=TStringList.Create;
Tmp.Add('1'); Tmp.Add('1'); Prev1:=1; Prev2:=1; {Первые два числа}
for i:=3 to N do {С третьего, т.к. 2 уже получили}
begin
 Curr:=Prev1+Prev2;
 Tmp.Add(IntToStr(Curr));
 Prev1:=Prev2; Prev2:=Curr;
end;
end;


Real   (2006-10-01 15:44:00) [16]

Алгоритм - находится в самом вопросе: "каждый последующий член равен сумме предыдущих". Это вполне достаточно чтобы приступать к написанию кода.


Наверх

Титульная страница Поиск, карта сайта Написать письмо