Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Последовательность Фиббоначи   Найти похожие ветки 

 
Фиббоначи   (2006-10-01 15:29) [0]

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


 
Real ©   (2006-10-01 15:44) [1]

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


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

> [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;


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

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


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

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:29) [5]

> [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;


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


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

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) [7]

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:33) [8]

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


 
Zeqfreed ©   (2006-10-01 16:49) [9]

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;


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


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

Вот код немного переработынный код [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 17:59) [11]

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

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


 
X9 ©   (2006-10-01 18:18) [12]

> [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.


 
Real ©   (2006-10-01 22:51) [13]

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


 
Zeqfreed ©   (2006-10-01 22:59) [14]

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

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


 
Real ©   (2006-10-01 23:21) [15]

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


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

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


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


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



Страницы: 1 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
4-1148422772
LiveSoft
2006-05-24 02:19
2006.10.22
Обратботка своего пункта меню


3-1155909872
el_serpiente
2006-08-18 18:04
2006.10.22
Подключение через SQL запрок в FireBird к внешней базе данных


11-1135587146
MTsv DN
2005-12-26 11:52
2006.10.22
Как будет на ASM е...


2-1160387648
Steep[on work]
2006-10-09 13:54
2006.10.22
Ссылка


3-1156846974
Дырчик
2006-08-29 14:22
2006.10.22
Как запаковать таблицу