母牛生仔的遞歸算法和非遞歸算法。


//一隻母牛,第二年底生一隻母牛和一隻公牛,第三年底生一隻母牛 ,第五年開始母牛會死。公牛也只能活四年。請問一個農場開始只有一隻剛出生的母牛,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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章