A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

李凯

中级黑马

  • 黑马币:7

  • 帖子:25

  • 精华:0

© 李凯 中级黑马   /  2013-4-10 19:37  /  1265 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李凯 于 2013-4-11 11:56 编辑

这是论坛活动的题目,看到题目首先我也想到用递归的方式比较好,因为递归能够拆分复杂的问题变成很多小问题,并一一解决。但是问题来了,虽然知道递归比较好,可是发现不会用递归。于是,我就百度了一下,结果就得到了如下代码,结果是对的,但是我没弄明白,也没弄明白这道题目的解题思路。特别拿出来请教一下,这个递归算法。最好能有递归算法资源让我学习学习。
注:我并非有意泄露论坛活动的题目。如果有人用如下代码应付论坛活动,均与本人无关。我只是为了学习。才拿出来请教。我因为做不了所以也并没用此答案来回答论坛活动。

public class Test9 {
                //定义牛的总数
        static int count=1;
        public static void main(String[] args) {
                add(0,0);
                System.out.println(count);
        }

        private static void add(int nian,int age){
                                //度过的年
                     nian++;
                               //牛的年龄
                age++;
                                //如果在10年之内
                if(nian<=10){
                                                 //如果牛的年龄大于或者等于3
                        if(age>=3){
                                                                //累加牛的总数
                                count++;
                                add(nian,0);
                        }
                        add(nian,age);
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
首先,递归,你可以想想成循环。for循环也可以看作类似递归的东西。但是for循环和递归有个本质区别在于,for循环,是在循环外,进行判断,以决定是否直接退出。而递归,是在循环体内判断,是否退出本次循环。这里就有两个差别了。
1、并不是说for循环不能在循环体内跳出,完全可以,但是希望强调,这个判断是针对循环体独立的,所以我说循环外,而递归的判断是针对每次的具体的循环而不是对整体循环是否停止做判断。
2、for跳出循环体,则前面的循环均不会再重现,而递归是退回到上一次的循环。
上面两者合起来就是我说的比较本质的区别。由此递归,是行为上循环。而每次循环,均属于自己独立的空间。而多次循环是累加,嵌套的。
你可以把递归看做到楼顶取东西。从一楼爬,看,不是的,继续爬,每层楼梯看上去都一样,你执行的过程都一样,但是实际上,1到2,2到3的楼梯是两个楼梯,等你到楼顶了,取了东西,你不能直接就跳楼,还得从楼顶一层层退回来。
而驴子拉磨,则属于for循环。无论跑多少次,都是在原地。变化的只是磨盘里磨的东西,而不是驴每圈所在的不同位置。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 通行天下 于 2013-4-10 20:10 编辑

问一下,题目是说三年后,第一头牛生了一头小牛,这句话不是等价于 要到第四年这头牛才会生小牛吗?你这程序咋会是第三年就开始生小牛了呢?求解啊???? 哥们,如果不嫌弃的话,你可以去看看我写的程序吧,和这个程序的唯一区别就是我理解的是要到第四年才生第一个小牛,比这个落后了一年。希望能帮到你。
回复 使用道具 举报
点击回复回复没反应,所以我直接回复了。1楼的哥们,很感谢你跟我说递归的原理。但是,我不明白的是这段代码:
if(nian<=10){
                                                 //如果牛的年龄大于或者等于3
                        if(age>=3){
                                                                //累加牛的总数
                                count++;
                                add(nian,0);
                        }
                        add(nian,age);
                }
回复 使用道具 举报
李凯 发表于 2013-4-10 20:22
点击回复回复没反应,所以我直接回复了。1楼的哥们,很感谢你跟我说递归的原理。但是,我不明白的是这段代 ...

只管一头牛就行,其他的不用考虑,这头牛三年之后,生了个肥仔,就是count++,然后母亲不管了,再操作这只肥仔,就是add(nian,0),三年之后,这肥仔又生了个肥仔...

递归就这意思,每次循环,均属于自己的独立个体,相互之间不会影响,所以你不用顾及它上一辈,都好好的呢,哈哈。
回复 使用道具 举报
郭华章 发表于 2013-4-10 19:52
首先,递归,你可以想想成循环。for循环也可以看作类似递归的东西。但是for循环和递归有个本质区别在于,fo ...

很棒的解释
回复 使用道具 举报
题目在哪儿
回复 使用道具 举报
黄玉昆 黑马帝 2013-4-11 08:42:40
8#
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
李凯 中级黑马 2013-4-11 11:58:52
9#
郭华章 发表于 2013-4-10 20:45
只管一头牛就行,其他的不用考虑,这头牛三年之后,生了个肥仔,就是count++,然后母亲不管了,再操作这 ...

很感谢,3Q,我多找点练习来做做吧。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马