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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔自成 中级黑马   /  2013-4-15 18:02  /  1474 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

该数列的规律是 从第3个数开始,每个数都是前两个数的和,  1,1,2,3,5,8,13,21,34..........
有道题是要求写个方法接受一个int类型的参数,返回参数指定的个数的菲波那契数列, 如参数是 5 ,那就返回 1,1,2,3,5
一开始我以为很简单,后来发现真的不会....求解。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 乘鱼飞 于 2013-4-15 18:36 编辑

普通方法:
import java.util.*;

public class Test {

        
        public static void main(String[] args) {
                int a=1,b=1,f;
                System.out.print("请输入一个整数:");
                Scanner sc=new Scanner(System.in);
                int n=sc.nextInt();
                System.out.print(n+"的斐波那契级数为");
                System.out.print("1"+" "+"1");
                for(int i=3;i<=n;i++)
                {
                        f=b;
                        b=a+b;
                        a=f;
                        System.out.print(" "+b);
                }
        }
}
递归方法:
import java.util.*;

public class Test {

        
                public static long fib(int n)
                {
                        if(n==1||n==2)
                                return 1;
                        else
                                return fib(n-1)+fib(n-2);
                }

        
        public static void main(String[] args) {
                System.out.print("请输入一个整数:");
                Scanner sc=new Scanner(System.in);
                int n=sc.nextInt();
                System.out.print(n+"的斐波那契级数为");
               
                for(int i=1;i<=n;i++)
                {
                        System.out.print(" "+fib(i));
                }
        }
}
输出结果:
请输入一个整数:5
5的斐波那契级数为 1 1 2 3 5
希望对你有所启发

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
解这类问题,首先一定要分析其数学模型,这也是程序设计的基础

这个题使用的是递归的思想。
F0=1,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)

这是数学模型。建议集中学习递归。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 一语中的

查看全部评分

回复 使用道具 举报
  1. import java.util.*;                        //记得导包,不然不能从键盘接收一个数值

  2. class Qbl
  3. {
  4.        public static long fib(int n)
  5.               {
  6.                       if (n <= 1)
  7.                                  return n;
  8.                      else
  9.                                  return fib(n-1) + fib(n-2);        //递归调用,实现菲波那契数列

  10.                }
  11. }

  12. class QblDemo
  13. {
  14.                 public static void main(String[] args)
  15.                {
  16.                                System.out.print("请输入一个整数:");
  17.                         Scanner sc=new Scanner(System.in);
  18.                         int n=sc.nextInt();
  19.                                 for(int i=1;i<=n;i++)
  20.                        {
  21.                                  System.out.print(Qbl.fib(i)+"\t");                //输出
  22.                        }
  23.                 }
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

  1. <DIV class=blockcode>
  2. <BLOCKQUOTE>import java.util.*;
  3. class FibDemo
  4. {
  5.           public static void main(String[] args)
  6.              {
  7.                   System.out.print("请输入一个整数:");
  8.                   Scanner sc=new Scanner(System.in);
  9.                   int n=sc.nextInt();
  10.                   System.out.print(n+"的斐波那契级数为");
  11.                   int x=1,y=1,f;
  12.                  for (int i=1;i<=n ;i++ )
  13.                      {
  14.                          if(i==1)
  15.                            System.out.print(1+" ");
  16.                          else if(i==2)
  17.                            System.out.print(1+" ");
  18.                          else
  19.                            {
  20.                                f=y;
  21.                                y=x+y;
  22.                                x=f;
  23.                               System.out.print(y+" ");
  24.                            }
  25.                       }

  26.            }
  27. }
复制代码
希望能对你有所帮助~~

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
用递归的思路的确简单,也容易理解,但是效率很低,稍加分析你就会发现每个递归分支都重复计算了很多次f(0)和f(1)。

其实还有一种比较简单的思路:建一个数组arr[],arr[0] = 1,arr[1] = 1,然后对于n>=2, arr[n] = arr[n-1] + arr[n-2]
这个递推公式不难得到,由于减少了大量的重复计算,运算效率高,计算结果得到了存储,以后调结果也方便,算法也很容易理解,供参考。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
黄玉昆 黑马帝 2013-4-16 12:35:47
7#
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
虽然楼上都给出了答案,但都是直接打印结果,而不是返回一个int[]数组,如以下代码
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 int[] arr = fib(14);
  4.                 for(int i:arr)        //遍历数组,打印所有数组中的值
  5.                         System.out.print(i+" ");
  6.         }
  7.         //方法接受一个int类型的参数,返回参数指定的个数的菲波那契数列(int[])
  8.         public static int[] fib(int n){
  9.                 int[] fibs = new int[n];
  10.                 if(n==1)
  11.                         fibs[0] = 1;
  12.                 else{
  13.                         fibs[1] = fibs[0] = 1;
  14.                         for(int i=2; i<n; i++){
  15.                                 fibs[i] = fibs[i-1] + fibs[i-2];
  16.                         }
  17.                 }
  18.                 return fibs;
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马