黑马程序员技术交流社区

标题: [回复送HMB]经典问题,兔子生兔子[代码解决篇][欢迎讨论] [打印本页]

作者: 1wang2huan    时间: 2015-9-6 08:21
标题: [回复送HMB]经典问题,兔子生兔子[代码解决篇][欢迎讨论]
本帖最后由 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楼的这个代码也不错,思路挺清楚,支持一下.
我只是比较习惯用递归解这样的可以递推的公式!
数学的思想,让我感到亲切,
我这里写出这个递归思路,只是为了交流用,不是装哦!

作者: 我张云杰    时间: 2015-9-6 08:50
递归函数没什么用,太占内存
作者: bustle    时间: 2015-9-6 09:13
这个递归是个死循环啊,没有结束条件。
作者: TTsu    时间: 2015-9-6 09:50
  if (1 == n || 2 == n) {
        total = 2;
else{
        total = Rabbits(n-1)+Rabbits(n-2);这if else相当精妙啊 再函数本身递归
厉害,也只有强哥了,这都能用递归写出来3月4 5月10 6-->16
作者: Joker_999    时间: 2015-9-6 10:03
斐波那契数列,貌似当时学的时候没太搞明白。。。尴尬
作者: ZQG    时间: 2015-9-6 10:25
顶一个~不过感觉递归还是能不用就不用吧
作者: 企业部-Mr.王    时间: 2015-9-6 10:26
递归不是用的特别少么?
作者: ai77033024    时间: 2015-9-6 10:28
循环挺好用的
作者: pyy061    时间: 2015-9-6 10:31
递归真是不好想,还是循环用的顺手
作者: 15095185209    时间: 2015-9-6 10:33
大神 膜拜,刚学到递归!
作者: 一丢丢大人    时间: 2015-9-6 10:35
递归明白了解就好,以后不会常用
作者: 靳小龙    时间: 2015-9-6 10:35
以前看到过这个代码
作者: 1wang2huan    时间: 2015-9-6 10:41
靳小龙 发表于 2015-9-6 10:35
以前看到过这个代码

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

  2. return 0;
  3. }
复制代码

作者: lixiaob626    时间: 2015-9-6 10:44
昨天刚听了一下递归,老师说用的少,要慎用和巧用递归。。。
作者: a124113798    时间: 2015-9-6 10:46
初学者还是不要钻那么深,对ios开发然并卵。。。
作者: jx836202365    时间: 2015-9-6 11:13
哦,我过来看看,递归函数比循环复杂,还不一定好用
作者: lxszl    时间: 2015-9-6 13:07
不明真相
作者: bustle    时间: 2015-9-6 13:12
用循环解,递归问题尽量都这么用。
  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,惭愧。
最后,顶楼主。
作者: 1wang2huan    时间: 2015-9-6 14:02
bustle 发表于 2015-9-6 13:12
用循环解,递归问题尽量都这么用。

这个代码也不错,思路挺清楚,支持一下.
我比较习惯用递归解这样的可以递推的公式!
数学的思想,让我感到亲切,
我这里写出这个,只是为了交流用,不是装哦!
作者: 王元18611727076    时间: 2015-9-6 14:09
昨天我也刚学过递归,彬彬老师说递归基本上都可用循环代替,改成循环试试
作者: 王鹏华ios0826    时间: 2015-9-6 14:09
技术分享贴~
作者: 钟先明    时间: 2015-9-6 14:11
尽量避免用递归吧,不好控制容易出现死循环;用其他几个循环语句不是也不错么
作者: yuan121    时间: 2015-9-6 14:12
sha啥?????、
作者: 西域男孩刚    时间: 2015-9-6 14:12
递归函数要慎用啊!即占内存,又容易出错。
作者: Music_棍棍    时间: 2015-9-6 15:08
已学习 谢谢
作者: 张健康ios0826    时间: 2015-9-6 15:44
#include<stdio.h>

int main(){
    int num1 = 0,num2 = 1,num = 0,month;
   
    printf("请输入想要查看第几个月的兔子:\n");
   
    scanf("%d",&month);
   
    for(int i=1;i<=month-1 ; i++){
   
        num=num1+num2;
        
        num1=num2;
        
        num2=num;
    }
   
    printf("第%d个月的兔子数为:%d对",month,num);
   
    return 0;
}
作者: 1wang2huan    时间: 2015-9-6 15:55
张健康ios0826 发表于 2015-9-6 15:44
#include

int main(){

想法不错,这种思路不是很好想到,我看明白了!棒棒哒!!,学习了!
作者: 张健康ios0826    时间: 2015-9-6 16:02
1wang2huan 发表于 2015-9-6 15:55
想法不错,这种思路不是很好想到,我看明白了!棒棒哒!!,学习了!

说好的黑马币呢- -
作者: 1wang2huan    时间: 2015-9-6 16:32
张健康ios0826 发表于 2015-9-6 16:02
说好的黑马币呢- -

你看回帖前几个,都把黑马币领走了!!!你来晚了....
作者: ------    时间: 2015-9-6 16:51
强哥v5,赞一个
作者: 羊口羊口羊    时间: 2015-9-6 20:55
谢啦!刚好我也碰到了这个问题
作者: 羊口羊口羊    时间: 2015-9-6 20:56
我咋没有回帖加分啊
作者: huahaoL    时间: 2015-9-6 21:43
牛叉




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