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

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

时间: 2024-10-10 18:23:34

母牛生仔的递归算法和非递归算法。的相关文章

二叉树先序、中序、后序遍历的递归算法和非递归算法

先序遍历:若二叉树为空,则空操作:否则访问根节点:先序遍历左子树:先序遍历右子树. 中序遍历:若二叉树为空,则空操作:否则中序遍历左子树:访问根节点:中序遍历右子树. 后序遍历:若二叉树为空,则空操作:否则后序遍历左子树:后序遍历右子树:访问根节点. 二叉链表:链表中的结点包含三个域:数据域和左右指针域. 三叉链表:在二叉链表的基础上增加指向双亲结点的指针域. 以下代码均使用二叉链表. //二叉树的二叉链表存储表示 typedef char TElemType; typedef struct B

【转】三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)

原文:http://blog.csdn.net/left_la/article/details/8206405 快速排序的三个步骤: 1.分解:将数组A[l...r]划分成两个(可能空)子数组A[l...p-1]和A[p+1...r],使得A[l...p-1]中的每个元素都小于等于A(p),而且,小于等于A[p+1...r]中的元素.下标p也在这个划分过程中计算. 2.解决:通过递归调用快速排序,对数组A[l...p-1]和A[p+1...r]排序. 3.合并:因为两个子数组时就地排序,将它们的

算法学习(4)----汉诺塔递归算法和非递归算法

学习<算法设计与分析基础>,习题2.4 第5题要求为汉诺塔游戏设计一个非递归的算法. 思,不得其解.看书后答案提示: 你如果做不到,也不要沮丧:这个问题的非递归算法虽然不复杂,但却不容易发现.作为一种安慰,可以在因特网上寻找答案. 好吧,话都说得这么直接了,遂百度之,得到一个感觉很好的答案,略做修改,摘录于下: 原文地址:http://blog.sina.com.cn/s/blog_48e3f9cd01000474.html ##################################

4.二叉搜索树转为有序双向链表(递归算法与非递归算法)

一.题目 要求输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建新的节点,只能调整树中结点指针的指向. 二叉树结点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode *m_pLeft; 5 BinaryTreeNode *m_pRight; 6 }; 图1.二叉搜索树转为有序双向链表 二.算法 (1)递归算法 因为二叉搜索树每个结点的子树也是一棵二叉搜索树,所以,我们可以把问题分解为, 把左子

汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法

非递归算法: 根据圆盘的数量确定柱子的排放顺序: 若n为偶数,按顺时针方向依次摆放 A B C: 若n为奇数,按顺时针方向依次摆放 A C B. 然后进行如下操作: (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B:若圆盘1在柱子B,则把它移动到C:若圆盘1在柱子C,则把它移动到A. (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上.即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘. (3)反复进行(1)(2

二叉树的前序、中序、后序遍历的递归和非递归算法实现

1 /** 2 * 二叉树的前序.中序.后序遍历的递归和非递归算法实现 3 **/ 4 5 //二叉链表存储 6 struct BTNode 7 { 8 struct BTNode *LChild; // 指向左孩子指针 9 ELEMENTTYPE data; // 结点数据 10 struct BTNode *RChild; // 指向右孩子指针 11 }; 12 13 /** 14 * 前序遍历 15 **/ 16 // 递归实现 17 void PreorderTraversal(BTNo

二叉树遍历非递归算法——后序遍历

在前面先后介绍了二叉树先序遍历的非递归算法和中序遍历的非递归算法,这里则来介绍二叉树后序遍历非递归算法,二叉树后序非递归遍历真的非常之 重要,因为它具有独特的特性(文章结尾会阐述),所以,在很多与二叉树相关的复杂算法中,经常要用到二叉树后序遍历的非递归算法.并且在互联网面试笔 试也经常考察该算法,所以,我们应该对二叉树后序遍历非递归算法乱熟于心. 和二叉树先序遍历.中序遍历非递归算法一样,后序遍历非递归算法同样是使用栈来实现:从根结点开始,将所有最左结点全部压栈,每当一个结点出栈时, 都先扫描该

数据结构算法实现-二叉树遍历的非递归算法

由于递归算法使用系统堆栈,性能较差,所以应尽可能使用非递归算法. 1.先序遍历 先序遍历,即得到节点时输出数据. // 先序遍历 function PreOrder(node){ if(node!==undefined){ console.log(node.data) } var stack=[] //模仿递归的栈 stack.push(node) for(var temp=node,i=0;temp!==undefined;temp=stack[stack.length-1]){ if(tem

二叉树的三种遍历的递归与非递归算法

今天复习了一下二叉树的前序遍历.中序遍历.后序遍历的递归与非递归算法,顺便记录一下: //TreeTest.h #include <iostream> struct TreeNode { int value; TreeNode* leftChild; TreeNode* rightChild; void print() { printf("%d ",value); } }; class MyTree { private: TreeNode* m_root; TreeNode