关于猴子分桃的算法讲解

猴子分桃递归算法分析。 /*

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); } } }

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4