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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 1wang2huan 于 2015-9-6 14:36 编辑

问题来源:

兔子问题  完全混乱 求帮助
http://bbs.itheima.com/thread-234606-1-1.html
(出处: 黑马程序员IT技术论坛)

具体问题:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问每个月的兔子总数为多少?
  1. #include <stdio.h>


  2. /**
  3. *  递归函数计算
  4. *
  5. *  @param n 想查看的第几个月
  6. *
  7. *  @return 兔子的数量
  8. */
  9. int Rabbits(int n){
  10.     int total;
  11.     if (1 == n || 2 == n) {
  12.         total = 2;
  13.     }else{
  14.         total = Rabbits(n-1)+Rabbits(n-2);
  15.     }

  16.     return total;
  17. }
  18. //主函数
  19. int main() {
  20.     int n = 1;
  21.     printf("请输入你想查第几个月的兔子:\n");
  22.     scanf("%d",&n);
  23.     getchar();
  24.     int total = Rabbits(n);
  25.     printf("第%d个月有%d只兔子",n,total);
  26.     return 0;
  27. }
复制代码


16楼的这个代码也不错,思路挺清楚,支持一下.
我只是比较习惯用递归解这样的可以递推的公式!
数学的思想,让我感到亲切,
我这里写出这个递归思路,只是为了交流用,不是装哦!

评分

参与人数 1黑马币 +2 收起 理由
jx836202365 + 2 淡定

查看全部评分

32 个回复

倒序浏览

回帖奖励 +1

递归函数没什么用,太占内存
回复 使用道具 举报

回帖奖励 +1

这个递归是个死循环啊,没有结束条件。
回复 使用道具 举报

回帖奖励 +1

  if (1 == n || 2 == n) {
        total = 2;
else{
        total = Rabbits(n-1)+Rabbits(n-2);这if else相当精妙啊 再函数本身递归
厉害,也只有强哥了,这都能用递归写出来3月4 5月10 6-->16
回复 使用道具 举报

回帖奖励 +1

斐波那契数列,貌似当时学的时候没太搞明白。。。尴尬
回复 使用道具 举报

回帖奖励 +1

顶一个~不过感觉递归还是能不用就不用吧
回复 使用道具 举报
企业部-Mr.王 来自手机 中级黑马 2015-9-6 10:26:36
7#

回帖奖励 +1

递归不是用的特别少么?
回复 使用道具 举报

回帖奖励 +1

循环挺好用的
回复 使用道具 举报
pyy061 来自手机 中级黑马 2015-9-6 10:31:53
9#

回帖奖励 +1

递归真是不好想,还是循环用的顺手
回复 使用道具 举报

回帖奖励 +1

大神 膜拜,刚学到递归!
回复 使用道具 举报

回帖奖励 +1

递归明白了解就好,以后不会常用
回复 使用道具 举报
靳小龙 来自手机 中级黑马 2015-9-6 10:35:43
12#
以前看到过这个代码
回复 使用道具 举报
靳小龙 发表于 2015-9-6 10:35
以前看到过这个代码

哦,是吗!那你看过这个代码吗?
  1. int main(){

  2. return 0;
  3. }
复制代码
回复 使用道具 举报
昨天刚听了一下递归,老师说用的少,要慎用和巧用递归。。。
回复 使用道具 举报
初学者还是不要钻那么深,对ios开发然并卵。。。
回复 使用道具 举报
哦,我过来看看,递归函数比循环复杂,还不一定好用
回复 使用道具 举报
不明真相
回复 使用道具 举报
用循环解,递归问题尽量都这么用。
  1. #include <stdio.h>

  2. int main(){

  3. int n;
  4. printf("请输入你想知道哪个月兔子的对数\n");
  5. scanf("%d",&n);

  6. int a[100]={1,1}; //在Xcode里可以定义a[n],定义a[n]必须满足n>=3,且单独定义a[0]=1,a[1]=1,这里只作整理思路

  7. if (n<100){
  8.        
  9. for (int i=2;i<n;i++){ //从第3个月开始
  10.         a[i]=a[i-1]+a[i-2];
  11. }
  12. printf("第%d个月兔子的对数为%d\n",n,a[n-1]);
  13. }
复制代码


思路整理:递归类问题的解决,一般都可以借用一维数组,先定义一个数组,用下标来表示各个元素,最后取出你想要的元素。
用循环不完美的地方:数据类型有值域宽的限制,a[10000]会非常大,可能存不下。//主要是因为我用32位win7,又没装 visual basic ,只能跑跑免费软件C-Free,惭愧。
最后,顶楼主。
回复 使用道具 举报
bustle 发表于 2015-9-6 13:12
用循环解,递归问题尽量都这么用。

这个代码也不错,思路挺清楚,支持一下.
我比较习惯用递归解这样的可以递推的公式!
数学的思想,让我感到亲切,
我这里写出这个,只是为了交流用,不是装哦!
回复 使用道具 举报
昨天我也刚学过递归,彬彬老师说递归基本上都可用循环代替,改成循环试试
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马