Форум: "Начинающим";
Текущий архив: 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