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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄丽慧 中级黑马   /  2012-7-2 08:44  /  2494 人查看  /  5 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

在网上看到这样一个编程题目
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   
//
这是一个菲波拉契数列问题
刚看到题目的时候觉得这么短的题目应该是非常简单,但是当我分析完题目时,脑袋里面成了一团浆糊,所以就只好看看别人写的代码——真的是非常简单:

public class lianxi01 {
public static void main(String[] args) {
System.out.println("
1个月的兔子对数:    1");
System.out.println("
2个月的兔子对数:    1");
int f1 = 1, f2 = 1, f, M=24;
     for(int i=3; i<=M; i++) {
      f = f2;
      f2 = f1 + f2;
      f1 = f;
      System.out.println("
" + i +"个月的兔子对数: "+f2);
         }
}
}


问题:该编程题是怎么分析的,如何创建变量及实现需求的,另外以后碰到这样的编程题要怎么进行分析思考?

5 个回复

倒序浏览
首先审清题意,理解题目中的关系:开始有兔子的对数是1,第10个月以后可以生10-3+1=8对;
3个月以后新生的小兔子可以生10-6+1=5对兔子;
4个月以后新生的小兔子可以生10-7+1=4对兔子;
5个月以后新生的小兔子可以生10-8+1=3对兔子;
6个月以后新生的小兔子可以生(10-9+1)×2=4对兔子;
7个月以后新生的小兔子可以生(10-10+1)×3=3对兔子.再把它们相加即可.

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
//这是一个菲波拉契数列问题
这个注解是原题目给出的吗?如果是,这道题就没什么了
问题的解答就是简单的在推演Fibonacci Sequence,只要你知道这个数列是怎么来的,就很容易
Fibonacci数列的实现是在《算法导论》中讲解递归的算例
数列的基本规则是
F0=1
F1=1
F2=2
F3=3
F4=5
.
.
.
F(N)=F(N-1)+F(N-2)
当N趋向于无穷大时,Fibonacci数列后项与前向的比趋向于黄金分割
既然说到递归,就再深谈一步
递归这种编程方法在很多的公司中是明令禁止的,因为不利于调试,而且往往会引发一些无法控制的结果
另外,任何递归结构都可以改写为非递归结构

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
杨_扬 发表于 2012-7-2 09:49
//这是一个菲波拉契数列问题
这个注解是原题目给出的吗?如果是,这道题就没什么了
问题的解答就是简单的在 ...

嗯,我要问的就是如何推演Fibonacci Sequence,这下子明白了,在看题目的时候觉得应该是递归,可能是对递归不是很了解,所以解题思绪比较乱。
回复 使用道具 举报
黄丽慧 发表于 2012-7-2 10:06
嗯,我要问的就是如何推演Fibonacci Sequence,这下子明白了,在看题目的时候觉得应该是递归,可能是对递 ...

递归不了解没关系的,很多大公司的编程守则上规定禁止使用递归,比如华为,呵呵
回复 使用道具 举报
个人觉得 遇到这类问题 可以抽象的思考 根据题的数量关系 抽象出题目满足哪种数学关系 这一题是菲波拉契数列问题 就可以根据菲波拉契数列的原理 考虑问题的实现和变量的创建
再比如 求1+2+3+……+N的和  大家都会习惯用循环解决 其实分析一下 这不就是数学中的数列前N项和的问题吗 1+2+3+……+N = ((1+n)*n)/2  那么可以这样用
public class Sum
{
        public int getSum(int i)
        {
                return ((i+1)*i)/2;
        }
        public static void main(String[] args)
        {
                Sum s = new Sum();
                         int n = 0;
                n = s.getSum(100);
                System.out.println("1+2+3+……+100的和是"+n);
               
        }
}

这样算的效率要比循环高上一些
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马