猴子分桃递归算法分析。 /*
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); } } }