Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
Фиббоначи   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 2.634 c
8-1143042841
Sco
2006-03-22 18:54
2006.10.22
Отразить обьект


3-1156838940
StriderMan
2006-08-29 12:09
2006.10.22
Конвертирование БД FireBird.


15-1159783231
Slider007
2006-10-02 14:00
2006.10.22
С Днем рождения ! 27 сентября


2-1159904904
Lelja
2006-10-03 23:48
2006.10.22
размещение справки в проге


2-1160035684
Megabyte
2006-10-05 12:08
2006.10.22
Обработка исключения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский