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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 清净明诲 中级黑马   /  2014-7-11 23:03  /  2100 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
前两项,毫无头绪,到底应该如何考虑呢??


还有一道题是这样的,
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
问每个月的兔子对数为多少?


这两道题应该怎么做呢??

13 个回复

倒序浏览
1、数据大小,因为如果真的到了64位的话,int类型和long型都不能都不能满足的。
回复 使用道具 举报
2、A=(A-1)+(A-2);首先前两个数必须知道。3、递归的运用了
回复 使用道具 举报
其实这两个题的要求是一样的,小兔子的算法就斐波那契数列的算法!!!下面是我写的思路和代码,你参考下!!!
  1. /*
  2. * 思路:第一项是1,第二项是1;
  3. *                 第三项=第一项+第二项
  4. *                 第四项=第三项+第二项
  5. *
  6. * 定义一个函数用于获取每一项的值:getNum(n);  n就表示第几项
  7. * 分情况:1.当n为1和2时,  getNum()就为1;
  8. *                 2.当n>2时,第n项=第n-1项+第n-2项,即 getNum(n)=getNum(n-1)+getNum(n-2)
  9. *                 3.同时为了保证输入第几项的n正确,添加一个判断.
  10. */

  11. public class Test02 {

  12.         public static void main(String[] args) {

  13.                 // 定义变量month表示
  14.                 int month = 40;

  15.                 // 定义变量num获取getNum()的返回值
  16.                 int num = getNum(month);

  17.                 // 打印输出结果
  18.                 System.out.println(num);
  19.         }

  20.         // 定义函数,将需要计算的n传入
  21.         private static int getNum(int mouth) {

  22.                 // 数值合法性判断,当month<1不合法,返回一个逻辑错误数据-1;
  23.                 if (mouth < 1) {
  24.                         return -1;
  25.                 }

  26.                 // 当mouth,即第n项中的n>2时,就等于前两项的和
  27.                 if (mouth > 2) {
  28.                         return getNum(mouth - 1) + getNum(mouth - 2);
  29.                 }

  30.                 // 最后将month为1和2的情况列出
  31.                 else if (mouth == 2) {
  32.                         return 1;
  33.                 } else {
  34.                         return 1;
  35.                 }
  36.         }
  37. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
淡夜清风 + 1 赞一个!

查看全部评分

回复 使用道具 举报
idency 发表于 2014-7-12 01:02
其实这两个题的要求是一样的,小兔子的算法就斐波那契数列的算法!!!下面是我写的思路和代码,你参考下!!!
...

好难啊,你是怎么有思路的,我感觉好难啊
回复 使用道具 举报
清净明诲 发表于 2014-7-12 22:31
好难啊,你是怎么有思路的,我感觉好难啊

我刚开始接触到时候也没思路,后来接触递归接触多了就明白多了,其实现在不懂没关系,以后碰到递归题多了就好了
回复 使用道具 举报
idency 发表于 2014-7-12 22:47
我刚开始接触到时候也没思路,后来接触递归接触多了就明白多了,其实现在不懂没关系,以后碰到递归题多了就 ...

我要加你,赶快私信告知下你的企鹅号,我要加你
回复 使用道具 举报
赵顺超 来自手机 中级黑马 2014-7-12 22:54:15
8#
清净明诲 发表于 2014-7-12 22:31
好难啊,你是怎么有思路的,我感觉好难啊

递归在视频后几节里有,给你举个例子,给你一个大箱子,里面有很多小箱子,礼物在最里面,那么,拆箱子就是方法,你得重复很多次,而且这件事,必须把最里面拆了,才能完成。斐波那契数列中,假如是第五个,就是数字5。那么,5=3+2=(1+2)+(1+1)=(1+(1+1))+(1+1)
回复 使用道具 举报
赵顺超 来自手机 中级黑马 2014-7-12 23:05:07
9#
idency 发表于 2014-7-12 22:47
我刚开始接触到时候也没思路,后来接触递归接触多了就明白多了,其实现在不懂没关系,以后碰到递归题多了就 ...

我想了半天,你那个递归,是不是应该在大于1的时候就递归,然后应该是              
  if (mouth > 1) {
                        return getNum(mouth - 1) + 1
                };
我看了好几遍,用5验证你那个就成了8了。
你看看,对不对
回复 使用道具 举报
赵顺超 来自手机 中级黑马 2014-7-12 23:10:49
10#
idency 发表于 2014-7-12 22:47
我刚开始接触到时候也没思路,后来接触递归接触多了就明白多了,其实现在不懂没关系,以后碰到递归题多了就 ...

我错了,就是你那个样子
回复 使用道具 举报
赵顺超 发表于 2014-7-12 23:10
我错了,就是你那个样子

在month为2时,他的前两项分别是第一项和第0项,第0项是没有的!:handshake
回复 使用道具 举报
清净明诲 发表于 2014-7-12 22:48
我要加你,赶快私信告知下你的企鹅号,我要加你

论坛私信发不了...  我qq:466522501
回复 使用道具 举报
idency 发表于 2014-7-13 00:02
论坛私信发不了...  我qq:466522501

已经添加了
回复 使用道具 举报
这些都属于算法了,买本算法书看看,或者在网上搜一下...............
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马