//一隻母牛,第二年底生一隻母牛和一隻公牛,第三年底生一隻母牛 ,第五年開始母牛會死。公牛也只能活四年。請問一個農場開始只有一隻剛出生的母牛,N年後一共有多少隻牛。
//請寫一個函數輸出結果,用遞歸和非遞歸兩種方法來實現.
function cowrecursion($i)
{
if ($i == 1) //如果是第一年,則1頭牛。
{
return 1;
}
elseif ($i == 2)
{
return 2 + cowrecursion(1); //第一母牛和兒子們+第二母牛第一年
}
elseif ($i == 3)
{
return 2 + cowrecursion(2) + cowrecursion(1); //第一母牛和兒子們+第二母牛第二年 +第三母牛第一年
}
elseif ($i ==4)
{
return 2 + cowrecursion(3) + cowrecursion(2); //第一母牛和兒子們+第二母牛第三年 +第三母牛第二年
}
// elseif ($i == 5)
// {
// return cowrecursion(4) + cowrecursion(3); //第一母牛死了。公牛也死了。第二母牛第四年 +第三母牛第三年
// }
elseif ($i >= 5)
{
return cowrecursion($i-1) + cowrecursion($i-2);
}
}
//非遞歸方式實現
function cow_norecursion($i)
{
//實現思路,用數組來存儲,value的值表示年限。循環加1.
$cows = array(1); //第一年,1頭母牛。
$cowsmale = array(); //用於存儲公牛
for ($j=0;$j<$i;$j++) //循環多少年
{
//循環母牛
$cows_copy = $cows;
foreach ($cows as $key => $value)
{
switch($cows_copy[$key])
{
case 1:
break;
case 2:
$cows_copy[] = 1;
$cowsmale[] = 1;
break;
case 3:
$cows_copy[] = 1;
break;
case 4:
break;
case 5:
unset($cows_copy[$key]);
break;
}
}
$cows = $cows_copy;
array_walk($cows, function(&$value, $index){
if ($value > 0) $value++;
});
$cowsmale_copy = $cowsmale;
//循環公牛
foreach ($cowsmale as $d => $value)
{
$cowsmale_copy[$d]++;
if ($cowsmale_copy[$d] == 5) //到第四年就死了
{
unset($cowsmale_copy[$d]);
}
}
$cowsmale = $cowsmale_copy;
}
return count($cows) + count($cowsmale);
}
echo "<br />list totol--->".cow_norecursion(26);
echo "<br />totol recursion--->".cowrecursion(26);
//end