![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Последовательность Фиббоначи
Фиббоначи © (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]Алгоритм - находится в самом вопросе: "каждый последующий член равен сумме предыдущих". Это вполне достаточно чтобы приступать к написанию кода.