黑马程序员技术交流社区

标题: 【递归】 [打印本页]

作者: wx_hg1q2t6v    时间: 2014-12-31 23:17
标题: 【递归】
/*  A/B/C/D/E 5个人在某天夜里合伙去捕鱼,
     第二天,A第一个醒来,他将鱼分成5份,把多余的一条鱼扔掉,拿走自己的一份.
     B第二个醒来,也将鱼分成5份,把多余的一条鱼扔掉,拿走自己的一份。
     C/D/E依次醒来,按同样的方法拿鱼。
     问他们合伙至少捕了多少条鱼?
*/

作者: 浅听    时间: 2014-12-31 23:44
递归这个有点难理解啊
作者: 从今以后    时间: 2015-1-1 01:43
  1. #import <stdio.h>
  2. int main()
  3. {
  4.     for (int i = 6; ; ++i) // 死循环遍历
  5.     {
  6.         int j, m = i; // i是条数 交给m避免i值改变
  7.         for (j = 1; j <= 5; ++j) // 能成功分配五次
  8.         {
  9.             if ((m - 1) % 5 != 0) break; // 每次丢一条能分5份 否则不符合题意退出
  10.             m = (m - 1) / 5 * 4; // 下次的条数 = 这次分5份取四份
  11.         }
  12.         if (j == 6) // 跑完循环才能j=6
  13.         {
  14.             printf("%d\n", i); // 打印这个条数 退出
  15.             break;
  16.         }
  17.     }
  18.     return 0;
  19. }
复制代码

作者: 任冰冰    时间: 2015-1-1 21:35
从今以后 发表于 2015-1-1 01:43

他说的是递归,兄弟。0.0
作者: sunshine429    时间: 2015-1-1 23:25
作为初学者来说。。试了一下午,用递归还真不会。。。
作者: 花轮    时间: 2015-1-1 23:31
哟嘿 小红红你还在啊
作者: sunshine429    时间: 2015-1-1 23:35
总感觉这个题只能用三楼的方式解决比较合适。。。我是初学者不太会。。我是在三楼的基础上算得了E拿到的鱼数,因为从递归的角度,要有明确的返回值,单纯无法判断明确的返回值,所以,还是三楼的方法是正解吧。。。 仅供参考的。。递归。。没技术含量
作者: romeo1990    时间: 2015-1-1 23:36
从今以后 发表于 2015-1-1 01:43

看你头像想打他
作者: 从今以后    时间: 2015-1-2 01:39
任冰冰 发表于 2015-1-1 21:35
他说的是递归,兄弟。0.0

{:3_60:}不要在意这些细节 递归不会做
作者: wx_hg1q2t6v    时间: 2015-1-2 21:37
浅听 发表于 2014-12-31 23:44
递归这个有点难理解啊

恩  可以不用递归,已经做出来了,谢啦
作者: wx_hg1q2t6v    时间: 2015-1-2 21:39
任冰冰 发表于 2015-1-1 21:35
他说的是递归,兄弟。0.0

感觉可以用递归,但是不会,,,,,,,
作者: wx_hg1q2t6v    时间: 2015-1-2 21:40
romeo1990 发表于 2015-1-1 23:36
看你头像想打他

why???????
作者: wx_hg1q2t6v    时间: 2015-1-2 21:41
sunshine429 发表于 2015-1-1 23:35
总感觉这个题只能用三楼的方式解决比较合适。。。我是初学者不太会。。我是在三楼的基础上算得了E拿到的鱼 ...

也是一种方法,不过应该说明255的鱼是怎么来的:)
作者: wx_hg1q2t6v    时间: 2015-1-2 21:43
从今以后 发表于 2015-1-1 01:43

思路清晰,给你点个赞!
作者: 浅听    时间: 2015-1-2 22:10
不错不错
作者: qyb1008    时间: 2015-1-2 22:34
sunshine429 发表于 2015-1-1 23:35
总感觉这个题只能用三楼的方式解决比较合适。。。我是初学者不太会。。我是在三楼的基础上算得了E拿到的鱼 ...

已经很接近正确答案了。我感觉你的捕鱼方法里面放一个指针,每次调用方法时用指针记录上次的值,如果等于1了可以返回指针的值。我只是有这个想法,试试再说吧。
作者: qyb1008    时间: 2015-1-2 22:36
wx_hg1q2t6v 发表于 2015-1-2 21:39
感觉可以用递归,但是不会,,,,,,,

递归就是方法调用自身,到一定条件才return吧。
作者: zhao190109    时间: 2015-1-2 22:46
:):D楼主加油
作者: sunshine429    时间: 2015-1-2 23:08
qyb1008 发表于 2015-1-2 22:34
已经很接近正确答案了。我感觉你的捕鱼方法里面放一个指针,每次调用方法时用指针记录上次的值,如果等于 ...

好吧,大家一起努力吧
作者: wx_hg1q2t6v    时间: 2015-1-3 23:49
zhao190109 发表于 2015-1-2 22:46
楼主加油

int main()
{   
    int totalFishNum = 0,i; //我们要试探进行所以需要一个变量假定捕鱼的总数量数量
    for (totalFishNum = 6; 1; totalFishNum++) {
        int flag = 1;  //我们还需要一个标记,如果我们试探出了一个合理的数字,用它来结束循环
        int leftFishNum = totalFishNum; //定义一个变量记录每次分鱼后剩下的条数,第一次分为捕鱼的数量
        for ( i = 1; i <= 5; i++)
                {            
            if ((leftFishNum - 1) % 5 == 0)//满足if条件说明第一次分配完成
            {
                leftFishNum = 4 * (leftFishNum - 1) / 5; //我们通过假设x的值  (x-1)/5 * 4
            }else
            {
                flag = 0; //如果不能被整除,就让我们的标记为0
                break; //结束当前循环
            }            
        }
        if(flag)
        {
            break;
        }
    }   
    printf("Total = %d\n",totalFishNum);     /*输出结果*/
}
作者: yesha    时间: 2015-1-3 23:52
学习了,难度还是挺大的
作者: wx_hg1q2t6v    时间: 2015-1-3 23:52
qyb1008 发表于 2015-1-2 22:36
递归就是方法调用自身,到一定条件才return吧。

en  是的
作者: wx_hg1q2t6v    时间: 2015-1-3 23:54
yesha 发表于 2015-1-3 23:52
学习了,难度还是挺大的

孰能生巧,多做题,一起努力吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2