skiperski » 24.03.2006 (Пт) 3:57
Примеры.
Константы:
Пбер = 280 дней
Всл = 540 дней
Кпот = 1 тёлка
Пример 1.
Переменные:
Нкол = 2 шт.
Висх = 540 дней
П = 100 дней
Примечания:
Очевидно, что за 100 дней стадо не увеличится
Решение:
Вкон = Висх + П = 540 + 100 = 640
Ст1 = Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) = Int((640-540)/280) - IIf(540>540,Int((540-540)/280),0) = Int(100/280) = 0
Пример 2.
Переменные
Нкол = 2 шт.
Висх = 540 дней
П = 1000 дней
Решение:
Вкон = Висх + П = 540 + 1000 = 1540
Ст1 = Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) = Int((1540-540)/280) - IIf(540>540,Int((540-540)/280),0) = Int(1000/280) = Int(3.57) = 3
т.к. коров две, то рождённых первым стадом всего стало быть 6.
Берём первый отёл. Он произошёл на 280 день после начала периода, следовательно возраст коров первого отёла к концу периода равен
Вкон = П - 280 = 1000 - 280 = 720 (вот это надо как-то формализовать)
Вызываем ту же функцию с новыми данными
Ст2 = Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) = Int((720-540)/280)-IIf(0>540,Int((0-540)/280),0) = Int(180/280) = Int(0.64) = 0
Возвращаем рез-т в первую функцию и анализируем.
Второе стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют.
Конечный результат: 6 новых + 2 исходных. Итого 8 шт.
Пример 3.
Переменные
Нкол = 2 шт.
Висх = 540 дней
П = 2000 дней
Решение:
|Вкон0 = Висх + П = 540 + 2000 = 2540
|Ст0 = Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) = Int((2540-540)/280) - IIf(540>540,Int((540-540)/280),0) = Int(2000/280) = Int(7.14) = 7
|т.к. коров две, то рождённых первым стадом всего стало быть 14.
|
|--|Берём первый отёл. Он произошёл на 280 день после начала периода, следовательно возраст коров первого отёла к концу периода равен
|--|Вкон1.0 = П - 280 = 2000 - 280 = 1720
|--|--|Вызываем ту же функцию с новыми данными. (Т.к. Висх всегда равен 0 и заведомо меньше Всл, то вычитаемое в дальнейшем можно опустить)
|--|--|Ст1 = Int((Вкон1.0 - Всл)/Пбер) = Int((1720-540)/280) = Int(1180/280) = Int(4.21) = 4
|--|--|--|Результат не нулевой, тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280=820 дней.
|--|--|--|Кол-во коров не меняется, т.к. каждая корова по условию приносит только одну тёлку.
|--|--|--|Вкон1.1 = Вкон1.0 - 820 = 1720 - 820 = 900
|--|--|--|Ст1.1 = Int((Вкон1.1 - Всл)/Пбер) = Int((900-540)/280) = Int(360/280) = Int(1.2) = 1
|--|--|--|--|Результат не нулевой, тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280=820 дней.
|--|--|--|--|Вкон1.1.1 = Вкон1.1 - 820 = 900 - 820 = 80
|--|--|--|--|Ст1.1.1 = Int((Вкон1.1.1 - Всл)/Пбер) = Int((80-540)/280) = 0 (ага, здесь нужно условие проверки достижения возраста первой случки!)
|--|--|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|--|--|Последнее стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют. Тем более, что и потомств больше нет.
|--|--|--|В итоге Ст1.1, т.е. потомки первого потомства = 2, т.к. исходных коров было 2 шт.
|--|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|--|Результат не нулевой и есть ещё помства.
|--|--|--|Тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280+280=1100 дней.
|--|--|--|Вкон1.2 = Вкон1.0 - 1100 = 1720 - 1100 = 620
|--|--|--|Ст1.2 = Int((Вкон1.2 - Всл)/Пбер) = Int((620-540)/280) = Int(80/280) = Int(0.2) = 0
|--|--|Возвращаем рез-т в первую функцию и анализируем.
|--|--|Последнее стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют.
|--|--|В итоге Ст1, т.е. все потомки первого потомства = 4*2 собственного потомства + 2 потомков их потомков. Игого: 10 шт.
|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|Результат не нулевой и есть ещё помства.
|--|--|Тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280+280=1100 дней.
|--|--|Вкон2.0 = П - 1100 = 2000 - 1100 = 900
|--|--|Ст2 = Int((Вкон2.0 - Всл)/Пбер) = Int((900-540)/280) = Int(360/280) = Int(1.2) = 1
|--|--|--|Результат не нулевой, тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280=820 дней.
|--|--|--|Вкон2.1 = Вкон2.0 - 820 = 900 - 820 = 80
|--|--|--|Ст2.1 = Int((Вкон1.1.1 - Всл)/Пбер) = Int((80-540)/280) = 0
|--|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|--|Последнее стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют. Тем более, что и потомств больше нет.
|--|--|В итоге Ст2, т.е. все потомки второго потомства = 1*2, т.к. исходных коров было 2 шт. Итого 2 шт.
|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|Результат не нулевой и есть ещё помства.
|--|--|Тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280+280+280=1380 дней.
|--|--|Вкон3.0 = П - 1100 = 2000 - 1380 = 620
|--|--|Ст3 = Int((Вкон3.0 - Всл)/Пбер) = Int((620-540)/280) = Int(80/280) = Int(0.2) = 0
|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|Последнее стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют.
|--|В итоге Ст0, т.е. все потомки исходного стада = 7*2 собственного потомства + 10 шт. потомков первого потомства + 2 шт. потомков второго потомства.
|--|Итого 26 шт.
|Конечный результат: 26 новых + 2 исходных. Итого 28 шт.
Если при всех этих вызовах записывать возраст или дату рождения каждого потомства в массив, то в результате сможем выложить любую статистику.