黑马程序员技术交流社区

标题: 关于斐波拉契数列的两种简单算法 [打印本页]

作者: xiaguangcheng    时间: 2014-11-16 00:41
标题: 关于斐波拉契数列的两种简单算法
对于许多零基础的同学,第一次碰到斐波拉契数列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. }
复制代码

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

作者: 冥夜    时间: 2014-11-16 00:59
额。。你这两个算法没有本质区别。更简洁点就用递归
作者: xiaguangcheng    时间: 2014-11-16 09:41
冥夜 发表于 2014-11-16 00:59
额。。你这两个算法没有本质区别。更简洁点就用递归

原来是这样。。递归还没有学到,谢谢了
作者: hailong    时间: 2014-11-16 10:53
  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. }
复制代码
使用递归来做比较方便,求第几项调用方法时就传几

作者: 王世虎    时间: 2014-11-16 11:40
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);
                }
        }
}
封装成函数调用
作者: striker    时间: 2014-11-16 12:10
楼主很认真呀,我好像做出来就没有思考过了。
作者: xiaguangcheng    时间: 2014-11-16 12:23
hailong 发表于 2014-11-16 10:53
使用递归来做比较方便,求第几项调用方法时就传几

老师没有讲递归,我也没有去总结,等我看了你的代码之后,才发觉递归果然是神器。
作者: xiaguangcheng    时间: 2014-11-16 12:24
striker 发表于 2014-11-16 12:10
楼主很认真呀,我好像做出来就没有思考过了。

那是因为大神你能够做出来,如果做不出来的话,你就会急于想搞明白了
作者: xiaguangcheng    时间: 2014-11-16 12:29
王世虎 发表于 2014-11-16 11:40
public class Test4
{
        public static void main(String[] args)

递归方法的确不错
作者: kang3214    时间: 2014-11-16 12:47
冥夜 发表于 2014-11-16 00:59
额。。你这两个算法没有本质区别。更简洁点就用递归

归递的效率不好!!
作者: striker    时间: 2014-11-16 20:52
xiaguangcheng 发表于 2014-11-16 12:24
那是因为大神你能够做出来,如果做不出来的话,你就会急于想搞明白了

我对递归还不是很了解
作者: 涉江    时间: 2014-11-17 14:18
感觉平常用递归很多,不知道那些不支持递归的语言是怎么简便的解决这些问题的。
作者: 郑泽霖    时间: 2014-11-17 14:49
递归啊,很简单的吧?
int Fibonacci(int n)
{
if(n==0)return 1;
if(n==1)return 1;
if(n>1)return F(n-1)+F(n-2);
}

作者: NCry    时间: 2014-11-17 14:59
递归是最好的方法




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