跳到主要内容

牛年求牛

问题描述

有一母牛,到4岁可生育,每年1头,所生均是一样的母牛,到15岁绝育,不能再生,20岁死亡,问n年后有多少头牛?

方法1:按照时间推移计算,嵌套循环

/**
* 方法1:按照时间推移计算,嵌套循环
* 用一个数组做中间联系,每出生一头牛往数组里添加一个元素,以当前的年份为值,最后统计数组元素,得出总数
* @param int $year
* @return int
*/
function getHowManyCowsForArray($year) {
if ($year < 4) {
return 1;
}
/**
* 循环第一层,4岁可以生育,往后每年生一头。起始便存在一头牛,第4年时便生了一头牛0岁。
* $list[序号] = 牛的生日;
*/
$list[] = 0;
for ($i = 4; $i <= $year; $i++) {
/**
* 循环第二层,取出上次新增的一头年,判断新增牛里面年龄是否有符合 [4岁, 15岁)。
* $i 为第一层当前年份,$list[$j] 为上次新增牛的生日年份,相减即为上次新增牛的年龄。
* 判断是否符合 [4岁, 15岁),符合再增加一头牛;如果到20岁便删除此牛。
*/
$count = count($list);
for ($j = 0; $j < $count; $j++) {
$age = $i - $list[$j];
if ($age >= 4 && $age < 15) {
array_push($list, $i);
} elseif ($age == 20) {
unset($list[$j]);
}
}
}
return count($list);
}

方法2:不断的计算每头牛的产出,使用递归

/**
* 方法2:不断的计算每头牛的产出,使用递归
* @param int $year
* @return int
*/
function getHowManyCowsForRecursion($year) {
static $counter = 1;
for ($i = 1; $i <= $year; $i++) {
// 年龄符合 [4岁, 15岁),便新增一头牛。
if ($i >= 4 && $i < 15) {
$counter++;
// 剩余的年数递归调用,直到最后一年。
getHowManyCowsForRecursion($year - $i);
}
// 到20岁时,便减少一头牛。
if ($i == 20) {
$counter--;
}
}
return $counter;
}