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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaguangcheng 中级黑马   /  2014-11-16 00:41  /  1113 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于许多零基础的同学,第一次碰到斐波拉契数列1,1,2,3,5,8,13,21,34,55时,都有可能会遇到这样的情况,就是能够找到规律,能够总结,但是却不能用代码来体现出来。这可能是我们初学者的通病,代码写的少是一方面,关于某些常识性的思想,我们接触的少也是其中之一。比如我们上课的时候,刘老师强调的求和思想,统计思想,我觉得都非常重要。题外话说多了,言归正传,我们再来看看斐波拉契数列,我第一次碰到这道题时,因为没有做出来,就死记硬背地把答案给背下来。当时的代码好像是这样的:
  1. class Test{
  2. public static void main(String [] args){
  3. int a=1;
  4. int b=1;
  5. int c;
  6. for(int x=3;x<30;x++){
  7. c=b;
  8. b=a+b;
  9. a=c;
  10. System.out.println("第"+x+"项为:"+b);
  11. }
  12. }
  13. }
复制代码

随后笔者就继续学习其他知识,比如面向对象,比如面向对象,API等,十几天之后,当我再次遇到回顾这道题时,发现以前怎么背的忘干净了。于是就又重新来做。于是发现了另外一种求法:
  1. class Test{
  2. public static void main(String [] args){
  3. int a=1;
  4. int b=1;
  5. int c;
  6. for(int x=3;x<30;x++){
  7. c=a+b;
  8. a=b;
  9. b=c;
  10. System.out.println("第"+x+"项为:"+b);
  11. }
  12. }
  13. }
复制代码

这两种算法,其他条件完全相同,就是在赋值的操作中,顺序不同。相信斐波拉契数列的类似算法还有很多,各位大侠如果知道其他的方法,还望不吝赐教。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

13 个回复

正序浏览
NCry 来自手机 中级黑马 2014-11-17 14:59:53
14#
递归是最好的方法
回复 使用道具 举报
递归啊,很简单的吧?
int Fibonacci(int n)
{
if(n==0)return 1;
if(n==1)return 1;
if(n>1)return F(n-1)+F(n-2);
}
回复 使用道具 举报
涉江 中级黑马 2014-11-17 14:18:14
12#
感觉平常用递归很多,不知道那些不支持递归的语言是怎么简便的解决这些问题的。
回复 使用道具 举报
xiaguangcheng 发表于 2014-11-16 12:24
那是因为大神你能够做出来,如果做不出来的话,你就会急于想搞明白了

我对递归还不是很了解
回复 使用道具 举报
kang3214 来自手机 中级黑马 2014-11-16 12:47:25
10#
冥夜 发表于 2014-11-16 00:59
额。。你这两个算法没有本质区别。更简洁点就用递归

归递的效率不好!!
回复 使用道具 举报
王世虎 发表于 2014-11-16 11:40
public class Test4
{
        public static void main(String[] args)

递归方法的确不错
回复 使用道具 举报
striker 发表于 2014-11-16 12:10
楼主很认真呀,我好像做出来就没有思考过了。

那是因为大神你能够做出来,如果做不出来的话,你就会急于想搞明白了
回复 使用道具 举报
hailong 发表于 2014-11-16 10:53
使用递归来做比较方便,求第几项调用方法时就传几

老师没有讲递归,我也没有去总结,等我看了你的代码之后,才发觉递归果然是神器。
回复 使用道具 举报
楼主很认真呀,我好像做出来就没有思考过了。
回复 使用道具 举报
public class Test4
{
        public static void main(String[] args)
                {

                circulation(30);
        }

        public static void circulation(int n)
                {
                for(int x=1;x<n;x++)
                                {
                        System.out.println(fib(x));
                }
        }

        public static long fib(int n)
                {
                if(n<=2)
                                {
                        return 1;
                }
                                else
                                {
                        return fib(n-1)+fib(n-2);
                }
        }
}
封装成函数调用
回复 使用道具 举报
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println(feibo(n));
  6.         }
  7.         public static int feibo(int num){
  8.                 if(num == 1)
  9.                         return 1;
  10.                 if(num == 2)
  11.                         return 1;
  12.                 return feibo(num-1)+feibo(num-2);
  13.         }
  14. }
复制代码
使用递归来做比较方便,求第几项调用方法时就传几
回复 使用道具 举报 1 0
冥夜 发表于 2014-11-16 00:59
额。。你这两个算法没有本质区别。更简洁点就用递归

原来是这样。。递归还没有学到,谢谢了
回复 使用道具 举报
额。。你这两个算法没有本质区别。更简洁点就用递归
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马