母牛生仔的递归算法和非递归算法。

来源:互联网 发布:mactype mac字体 编辑:程序博客网 时间:2024/05/01 20:45


//一只母牛,第二年底生一只母牛和一只公牛,第三年底生一只母牛 ,第五年开始母牛会死。公牛也只能活四年。请问一个农场开始只有一只刚出生的母牛,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

1 0
原创粉丝点击