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


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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值