当前位置:   article > 正文

递归解决分鱼问题_python递归分鱼

python递归分鱼

递归(分鱼问题)
A、B、C、D、E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了。第二天日上三竿时,A第一个醒来,他将鱼平分为5份,把多余的一条扔回河中,然后拿着自己的一份回家去了;B第二个醒来,但不知道A已经拿走了一份鱼,于是他将剩下的鱼平分为5份,扔掉多余的一条,然后只拿走了自己的一份;接着C、D、E依次醒来,也都按同样的办法分鱼。问这5人至少合伙捕到多少条鱼?每个人醒来后所看到的鱼是多少条?

分析
假设五个人捕鱼,一共捕到x条鱼。
第一个人完成操作后,剩余4*(x-1)/5
第二个人,第三个继续操作。且每次操作都必须保证(操作前的鱼数-1)mod 5=0;设每次操作前的数量为Xn(n=1,2,3,4,5)那么,第一次操作前为X1(X)
X2=4(X1-1)/5
X3=4(X2-1)/5
X4=4(X3-1)/5
X5=4(X4-1)/5
由此看出最适合进行递归操作
且如果规定了任意一个数的值,那么必然能推算出每一个数的值。同时Xn应该满足(Xn-1) mod 5= 0;
由此可知比较脑瘫的算法就是给定一个值(这个起始值应该是满足(Xn-1) mod 5=0 的最小数也就是6)对这个值进行检查,不满足条件就自增5直至检查通过位置,可以使用do—while循环

//完整的代码(分鱼问题)
#include <stdio.h>
int jiancha(int n,int t)//n表示此次操作的次数(n取1....5,从1开始自增至5,t表示此时的鱼的数量即Xn)
{if((t-1)%5 == 0){
	if(n == 5)
		return 1;//递归出口
	else return jiancha(n+1,4*(t-1)/5);}//递归调用函数*这里有一点疑惑就是当把n+1改为n++的时候在dev中无法正常运行代码,最后结果没有输出,求大佬帮忙*
 return 0;//不满足条件的递归出口
 }
 int main()
 {	int i=1;
 	int x=i*5+1;
 	int flag=0;//当满足条件的时候flag=1用于跳出do——while的循环
 	do
 	{	i++;
 		x=i*5+1;
 		if(jiancha(1,x)){
 			flag=1;
 			printf("这五个人一共抓到%d条鱼",x);}
 	}while(!flag); 
 	return 0;
 	} 				
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

时间复杂度我还不知道是什么,私以为与递归的次数会有关系即O(n),空间复杂度O(1)//不知道对不对
也是第一次写博客,望大佬指出改正的地方
这个题我还没有想出更好的算法

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/1018448
推荐阅读
相关标签
  

闽ICP备14008679号