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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2014, 16:50   #1
Silverstone
Пользователь
 
Регистрация: 13.12.2011
Сообщений: 75
По умолчанию Число Фибоначчи.

Задача:
В первом поколение 2 кролика.
Во втором поколение 6 кроликов.
Дальнейшее распределение кроликов идет по последовательности Фибоначчи. Кролики живут 4 года. Какое число кроликов будет через N лет.

Подсчет оставшихся кроликов решил делать так: в цикле ищу поколение, в котором умрут кролики (это mas[i+3]), и вычитаю из него текущее число кроликов в поколение (mas[i]).
Код:
  {Подсчет числа оставшихся кроликов}
  for i:=0 to years-1 do
   begin
    d:= mas[i+3]-mas[i];
    Memo1.Lines.Add(IntToStr(d));
   end;
Проблема в том, что цикл не учитывает число кроликов, чье время еще "не пришло". Плюс цикл лезет за границу массива.
Т.е, если задать 5 лет, то получиться последовательность кроликов такая - 2, 6, 8, 14, 22.
Через 4 года кролики начнут умирать, значит, надо работать с числами 14 и 22. В итоге останется 12 и 16 кроликов (ибо в первом поколение 2 кролика, а во втором - 6), но при этом не будут учтены кролики 3го поколения - там где их 8.


Код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  fibRes: integer;
  years, d, sum: integer;
begin
  Memo1.Clear;
  years:= StrToInt(Edit1.Text);
  setLength(mas,years);  // размер динамич.массива зависит от введенного числа лет

  {Подсчет кроликов с помощью последовательности фибоначчи}
  for I := 2 to years-1 do
   begin
     mas[0]:=2;
     mas[1]:=6;
     mas[i]:=mas[i-1]+mas[i-2];
   end;
  {Вывод в Memo числа кроликов в каждом году}
  for I := 0 to years-1 do
   begin
    Memo1.Lines.Add('Год '+IntToStr(i+1)+' = '+IntToStr(mas[i]));
   end;
  {Вывод на экран суммы элементов массива}
  sum:= 0;
   for I := 0 to High(mas) do
    sum:=sum+mas[i];
    Memo1.Lines.Add('Всего кроликов: '+IntToStr(sum));

   Memo1.Lines.Add('------');
  {Подсчет числа оставшихся кроликов}
  for i:=0 to years-1 do
   begin
    d:= mas[i+3]-mas[i];
    Memo1.Lines.Add(IntToStr(d));
   end;

end;
Silverstone вне форума Ответить с цитированием
Старый 25.05.2014, 18:23   #2
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Silverstone тупо на пальцах посчитай массив из 10 лет, и выложи сюда. По готовому массиву можно составить уравнение роста.
doktor255 вне форума Ответить с цитированием
Старый 25.05.2014, 18:32   #3
Silverstone
Пользователь
 
Регистрация: 13.12.2011
Сообщений: 75
По умолчанию

Цитата:
Сообщение от doktor255 Посмотреть сообщение
Silverstone тупо на пальцах посчитай массив из 10 лет, и выложи сюда. По готовому массиву можно составить уравнение роста.
2, 6, 8, 14, 22, 36, 58, 94, 152, 246
Silverstone вне форума Ответить с цитированием
Старый 25.05.2014, 21:21   #4
Silverstone
Пользователь
 
Регистрация: 13.12.2011
Сообщений: 75
По умолчанию

Ну так что, подскажет кто?
Весь день думаю над этим циклом, но ничего нормального не придумал.
Silverstone вне форума Ответить с цитированием
Старый 25.05.2014, 22:07   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Найди реализацию поиска N го числа Фибоначчи.. Там будет что-то вида f1:=1; f2:=1;
Единички замени на 2 и 6 соответственно
И думаю надо будет учесть частный случай
Poma][a вне форума Ответить с цитированием
Старый 25.05.2014, 23:06   #6
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Silverstone
Как я понимаю, в приведённом массиве нет вымирания? Ибо в коде у меня ни чего не мрёт, но массив массив получается. Смотрим.

Код:
function Krolik(Index: integer): integer;
var
 n, i: integer;
 nn: Array of Integer;
begin
  for I := 1 to Index do
    begin
     SetLength(nn, Length(nn) + 1);
     if i = 1 then nn[High(nn)] := 2;
     if i = 2 then nn[High(nn)] := 6;
     if i > 2 then nn[High(nn)] := nn[High(nn) - 2] + nn[High(nn) - 1];
    end;
  Result := nn[High(nn)];
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  for I := 1 to 20 do
    memo1.Lines.Add(IntToStr(Krolik(i)));
end;
2 6 8 14 22 36 58 94 152 246 398 644 1042 1686 2728 4414 7142 11556 18698 30254
doktor255 вне форума Ответить с цитированием
Старый 25.05.2014, 23:29   #7
Silverstone
Пользователь
 
Регистрация: 13.12.2011
Сообщений: 75
По умолчанию

Цитата:
Сообщение от doktor255 Посмотреть сообщение
Silverstone
Как я понимаю, в приведённом массиве нет вымирания? Ибо в коде у меня ни чего не мрёт, но массив массив получается. Смотрим.

2 6 8 14 22 36 58 94 152 246 398 644 1042 1686 2728 4414 7142 11556 18698 30254
Да, исходный массив такой. Вымирания в нем не реализовано.
После начала вымирания массив, по идеи, должен так выглядеть.
2 6 8 12 16 28 46 итд
Silverstone вне форума Ответить с цитированием
Старый 25.05.2014, 23:33   #8
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Код:
function Krolik(Index: integer): integer;
var
 i: integer;
 nn: Array of Integer;
begin
  for I := 1 to Index do
    begin
     SetLength(nn, Length(nn) + 1);
     if i = 1 then nn[High(nn)] := 2;
     if i = 2 then nn[High(nn)] := 6;
     if i > 2 then nn[High(nn)] := nn[High(nn) - 2] + nn[High(nn) - 1];
    end;
  Result := nn[High(nn)];
  if Index > 3 then
    Result := nn[High(nn)] - nn[High(nn) - 3];
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  for I := 1 to 20 do
    memo1.Lines.Add(IntToStr(Krolik(i)));
end;
2 6 8 12 16 28 44 72 116 188 304 492 796 1288 2084 3372 5456 8828 14284 23112

Как - то так. Весы там <=

Последний раз редактировалось doktor255; 25.05.2014 в 23:41.
doktor255 вне форума Ответить с цитированием
Старый 26.05.2014, 00:00   #9
Саня_
Пользователь
 
Регистрация: 05.03.2011
Сообщений: 36
Восклицание

Цитата:
Сообщение от doktor255 Посмотреть сообщение
[CODE]

2 6 8 12 16 28 44 72 116 188 304 492 796 1288 2084 3372 5456 8828 14284 23112
Возможно, я ошибаюсь, был тяжелый день, но... Ряд должен выглядеть следующим образом

Цитата:
2 6 8 14 20 28 40 54...
,

поскольку кролики живую 4 года, а не 3, то есть самые первые кролики (2) будут жить, пока их 2, 6, 8, 14 и только потом умрут
Саня_ вне форума Ответить с цитированием
Старый 26.05.2014, 00:09   #10
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Ряд должен выглядеть следующим образом
Поэтому в начале темы я и написал. дай РЕАЛЬНЫЙ массив, а я подгоню вычисления. А так остаётся только гадать. Я уже понял что вычисления сделаны не до конца. Ибо через двадцать лет нужно вычитать кроликов, не по количеству на 16 год, а количество родившихся кроликов от второго года до 16 + первая пара. А это ещё один простой цикл. Теория разжёвана, приятную процедуру составления кода предлагаю сделать самостоятельно

Последний раз редактировалось doktor255; 26.05.2014 в 00:20.
doktor255 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Число фибоначчи. Двумерный массив, максимальное и минимальное число. Silverstone Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 02.12.2012 12:19
выводится n-е число Фибоначчи amikulia Помощь студентам 10 14.01.2011 20:45
число Фибоначчи (Pascal) Banderas123 Помощь студентам 6 06.12.2009 12:48
N-e число Фибоначчи MAKEDON Общие вопросы C/C++ 2 10.03.2009 13:01
Определить n-ое число Фибоначчи - Рекурсия Xeon332 Помощь студентам 3 09.01.2008 19:01