2013-10-01 5 views
1

Я пытаюсь разработать код для настройки на классических кроликах Fib. В этом случае они истекают х поколений после их рождения. Пример находится в ссылке ниже:Кролики фибоначчи, срок действия которых истекает

http://matheminutes.blogspot.com/2012/02/killing-fibonaccis-rabbits.html

Я понимаю таблицы на полпути вниз по ссылке, показывающий случай х = 2 (кролики истекает через 2 года) (таблица имеет 5 столбцов, где колонке 1 = «Год», столбец 2 = «Пары новорожденных кроликов», столбец 3 = «Пары новорожденных кроликов», столбец 4 = «Пары действительно зрелых кроликов», столбец 5 = «Всего»).

Согласно этой таблице, общее число кроликов каждый год следует последовательность 1, 1, 2, 2, 3, 4, 5, 7, 9, ...

Я разработал код, который кажется работа для x> 2 значений (Например, когда я устанавливаю x = 5, я получаю ряд: 1, 1, 2, 3, 5, 7, 11, 16, 24, 35 и т. д., которые, я считаю, верны).

Однако мой код, похоже, не работает для двух случаев: x = 2 (я получаю все 1s, когда мне нужно получить серии 1, 1, 2, 2, 3, 4, 5, 7, 9, ...) и x = 1 (я получаю 1, 0, 1, 0, 1, 0, когда я должен получить все 1 в соответствии со ссылкой выше).

Мой код выглядит следующим образом (в настоящее время полагая х = 5 для первых 22 чисел в последовательности):

public class TestFib { 

     public static void main(String args[]) { 
     int x = 5; 
     for (int i = 1; i < 22; i++) { 
      System.out.println("n = " + i + ", " + DeadRabbits(i, x)); 
     } 
    } 

    public static int DeadRabbits(int n, int x) { 
      int Fn; 
     if (n == 0) { 
      Fn = 0; 
     }  
     else if (n == 1) { 
      Fn = 1; 
     } 
     else if (n < x) { 
      Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x); 
     } 
     else { 
      Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x) 
       - DeadRabbits(n - x, x); 
     } 
     return Fn; 
    } 
} 
+0

Я видел ваше сообщение на math.stackexchange. Должен ли я предположить, что сообщение там спрашивало из более теоретического угла, и это больше осуществления? –

+0

Да, конечно. Я надеялся, что лучшее понимание теоретического угла поможет мне разобраться в проблемах с моим кодом! :) – LanneR

ответ

0

Во-первых, на выходе вы описали для x=5 является неправильным (должен быть 1, 1, 2, 3 , 5, 7, 11, 17, 26, 40, ...), и ваш код не дает правильного результата для любого x > 2.

x это всего года жизни (в том числе года младенчества), таким образом, для x = 1 вы должны получить (1, 0, 0, ...), для x = 2 вы должны получить все 1, а, x=3 вы получаете 1, 1, 2, 2, 3, 4, 5, 7, 9, ... и так далее.

Я починил вашу функцию и теперь она производит правильный выход для любого входа, вы имели недостающую частный случай n = x + 1, который создается за счет инициализации серии и вычитание в последнем случае следует назвать с n - x -1

public static int DeadRabbits(int n, int x) { 
    int Fn; 
    if (n < 1) { 
     Fn = 0; 
    }  
    else if (n == 1) { 
     Fn = 1; 
    } 
    else if (n < x + 1) { 
     Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x); 
    } 
    else if (n == x + 1) { 
     Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x) - 1; 
    } 
    else { 
     Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x) 
      - DeadRabbits(n - x - 1, x); 
    } 
    return Fn; 
} 

Надеюсь, это поможет.

+0

Здравствуйте, Рон: Я буду более внимательно смотреть на ваш код. Тем не менее, я думаю, что случай x = 2 должен иметь последовательность 1, 1, 2, 2, 3, 4, 5, 7, 9 (и не все 1s, как вы заявляете). Эта последовательность находится в ссылке выше (и большинство ссылок, на которые я смотрел), и в моем классе это была последовательность, предоставленная нам. Спасибо. – LanneR

+0

Подумайте об этом, x представляет количество столбцов в таблице, если x = 2, то у вас есть 1 младшая пара в начале, в 2 году у вас есть 1 взрослая пара и нет младенцев, 3 год - 1 пара младенцев и нет зрелые пары (они умерли) и т. д. ... каждый год имеет в общей сложности 1 пар, последовательность, о которой вы говорите, является правильной для x = 3. –

+0

Спасибо, Рон. Я подумаю об этом. Я дам вам ответ, потому что он поднимает хорошие идеи. Еще раз спасибо. – LanneR

Смежные вопросы