关于猴子分桃的算法讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于猴子分桃的算法讲解
猴子分桃递归算法分析。

/*
X个桃子有5只猴子第一只猴子把x个桃子分了5分还多出一个他把多了那个扔进大海拿走了一份
第二只猴子也是如此等到第五只猴子海滩至少能分到1个桃子。

问海滩上原来x是多少个桃子。

非递归算法描述:
数学抽象:假设海滩上现在有x个桃子,那么x向下再分一次,也就是n-1只猴子有桃可分的条件必须满足(x-1)是5的倍数。

下一只猴子再分桃,就是x的5分之4. N-1只猴子再分桃的条件就必须满足(x-1)*4/5 依次类推
算法设计:一个数x去判断x-1是否能被5整除。

如果可以,则把自己的五分之四拿出来作为下一次分桃的基数,再进行下一轮判断。

总共判断5轮,每一轮满足条件记为真,不满足记为假。

只要5轮都为真则找到x 否则 x继续++ 。

实现下一次5轮判断。

*/
namespace递归法_猴子分桃子
{
class Program
{
static int fen()//返回海滩上原来最少多少桃子
{
int m;
bool check =false; //用于判断是否执行了五次,亦可用j==5作为判 //断条件
int i =0;
while (true)
{
i++;
m = i;
for (int j =0; j <5; j++)
{
if ((m -1) %5!=0)//判断m-1是否被 //整除,亦可用(m-1)%5!=0代替
{
check =false;
break;
}
else
{
m = (m -1) *4/5;
check =true;
}
}
if (check ==true)
{
return i;
}
}
}
//递归算法
/*
递归算法
数学抽象,与非递归刚好相反,递归是倒退,从最后一只猴子向上推理。

假设当前猴子有x个桃
子,那么它对于下一轮的猴子来说,x-1要能分5份,而对上一轮的猴子还说,它是上一轮的5分之一。

算法设计:一个变量记录当前是第几只猴子。

一个变量记录当前猴子面前有原来桃子的总数。

如果当前就剩1只猴子则返回所有的桃子总数,否则判断当前的
桃子-1 时候够下一轮猴子平分5分,而且对于上一轮的猴子我是不是上面的4/5 求上一轮 x*5%4==0 如果是则上一轮的桃子是自己的5倍多1个而且都在总数-- 否则不满足条件则当前猴子总数不变,桃子总数++。

继续探测。

*/
public static int houzi3(int monkey, int pech)
{
if (monkey ==1)
{ return pech; }
else
{
if ((pech *5+1) %4==1)
// if ((pech - 1) % 5 == 0 && (pech - 1) % 4 == 0)
{
return houzi3(--monkey, (pech *5+1));
}
else
{
return houzi3(monkey, ++pech);
}
}
}。

相关文档
最新文档