有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。
递归版(论坛里的)
function t($n) {
static $num = 1;
for($j=1; $j<=$n; $j++){
$count++;
if($j>=4 && $j<15) {$num++;t($n-$j);}
if($j==20){$num--;}
}
return $num;
}
非递归版(原创)
function suanfa($n =10){
if ($n<=3){
return 1;
}else {
$arr = [];
$arr[] = 4;
for ($i = 4; $i <= $n; $i++) {
$count++;
$newArr = [];
foreach ($arr as $key => $age) {
if ($age < 3) {
$arr[$key] = $age + 1;
} elseif ($age < 15) {
$arr[$key] = $age + 1;
$newArr[] = 0;
} elseif ($age <19) {
$arr[$key] = $age + 1;
} else {
unset($arr[$key]);
}
}
foreach ($newArr as $value){
$arr[] = 0;
}
}
return count($arr);
}
}
两者在时间大于20年后有差异,因为题目对于这个过一年的定义很模糊,不过思路肯定是没问题。递归算法看似代码很少,实际执行的循环次数是比非递归版的多的,而且代码可读性差。