//一只母牛,第二年底生一只母牛和一只公牛,第三年底生一只母牛 ,第五年开始母牛会死。公牛也只能活四年。请问一个农场开始只有一只刚出生的母牛,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
原文地址:http://blog.csdn.net/naola2001/article/details/45233023