Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2009, 15:19   #1
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию Оптимизация програмы по поиску чисел Фибоначи

Доброго времени суток.
Дело в следующем: я написал простую програмку для поиска чисел фибоначи в Дэлфи:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  I:integer;
function FIB(x:integer):longint;
begin
  if x<=1 then FIB:=1
  else FIB:=FIB(x-1)+FIB(x-2);
end;
BEGIN
Writeln('Fibonachi numbers');
Writeln('Enter number from 1 to 1000');
Readln(i);
Writeln ('Fibonachi number is: ',FIB(i));
readln
END.
Пока номер числа не превышает 34 все идет нормально, а после начинает тормозить (например для вычисления 40го числа понадобилось примерно 4 секунды). Все бы ничего, но задание у меня "найти сумму всех чисел фибоначи, которые не привосходят 1000".

Собственно ворос: можно как-то оптимизировать программу, чтобы она работала пошустрее?
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 17.11.2009, 15:35   #2
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Вгляделся в задачу, и понел свой косяк, тысячное число видимо искать вовсе и не надо.
Однако вопрос остается открытым, исключительно для общего развития
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 17.11.2009, 16:05   #3
dexterua
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 24
По умолчанию

Попробуй сделать без рекурсии, и наверно будет быстрее одним проходом без функции, что-то типа такого:

Код:
var
    I,sum,m1,m2,m3:longint;
begin
     Writeln('Fibonachi numbers');
     Writeln('Enter number from 1 to 1000');
     Readln(i);
     m1:=1;
     m2:=1;
     sum:=1;
     while(m2<i)do
     begin
          sum:=sum+m2;
          m3:=m2;
          m2:=m1+m2;
          m1:=m3;
     end;
     Writeln ('Fibonachi max is: ',m1);
     writeln('Summ all is: ',sum);
     readln
END.
оно будет считать сумму всех чисел фибоначи не превосходящих заданое i
dexterua вне форума Ответить с цитированием
Старый 17.11.2009, 17:41   #4
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

dexterua, самое смешное ты решил за меня задачу :D
Я же ее решил немного подругому, рекурсия проще для понимания (для меня, по крайней мере):

Код:
program fibonachi_less_1000;

{$APPTYPE CONSOLE}

uses
  SysUtils;
const
  n=20;
var
  i,max:integer;
  F:longint;

function FIB(x:integer):longint;
begin
  if x<=1 then FIB:=1
  else FIB:=FIB(x-1)+FIB(x-2);
end;

procedure E(z:integer; var S:longint);
  var
    y:integer;
  begin
    S:=0;
    for y:=0 to z do {Если начинать считать от F0, то y:=0,если от F1, то y:=1}
    S:=FIB(y)+S
  end;

BEGIN
  for i:=1 to n do
      begin
        FIB(i);
        if FIB(i)>1000 then
          begin
            max:=(i-1); {номер числа фибоначи после которого значения превосходят 1000}
            break;
          end;
      end;
E(max,F);
writeln('Sum of the Fibonachis numbers, which is no higer than 1000 is: ',F);
readln
END.
Ответы у нас совпали, значит, думаю, написал правильно, хоть и немного громоздко.

С решением самой задачи особых проблем не возникло, мне больше интересно как найти, например, сотое число фибоначи? если пользоваться описанной мной функцией, то уйдет много времени.

P.S. возможно вопрос глупый, но прошу извинить, паскаль первый раз увидел в сентябре этого года.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Внимание вопрос по поиску! alexkey Microsoft Office Excel 11 25.09.2009 18:50
Вопрос по поиску в БД Evgenii БД в Delphi 1 17.06.2009 09:50
Плз помогите срочно! Числа Фибоначи Elme Помощь студентам 1 15.06.2009 21:54
программа по поиску списков литературы Marinca Свободное общение 1 14.12.2008 23:24
программа по поиску списков литературы Marinca Помощь студентам 1 14.12.2008 19:59