算法基础:递归---Fibonacci数列

又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

代码以及算法都比较简单如下:


import java.util.Scanner;

public class Fibonacci {
    public static void main(String args[]) {

        Scanner input = new Scanner(System.in);

        int n, remainder = 1;
        System.out.printf("请输入所求数列数目:" + '\n');
        n = input.nextInt();

        System.out.print(Fibo(n));
    }

    static int Fibo(int n) {
        if (n <= 2) {
            return 1;
        }
        return Fibo(n - 1) + Fibo(n - 2);
    }
}

另外刚刚做了蓝桥杯里面的一个关于斐波那契数列的题目,题目以及代码如下:

《算法基础:递归---Fibonacci数列》


import java.util.Scanner;

public class Fibonacci2 {
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);

        int a=1,b=1,sum=1;
        int n;
        n = input.nextInt();

        if (n<=2)
            System.out.println(sum);
        else {
            for (int i=3;i<=n;i++){
                sum=(a+b)%10007;
                a=b;
                b=sum;
            }
            System.out.println(sum);
        }
    }
}
 

这是一个很水的题目,需要提及的一点在于需要防止数列过大而造成溢出,所以要在循环体中每次计算前都加上一个判断,判断是否超过给定数字的大小。

另外,这个题目代码用的是递推不是递归,如果用一个方法写递归算法再在主方法中引用的话运行会超时。

ps:刚开始我想着是不是用数组存储大数一样,在n的数目很大的时候将数列存储起来,但是想着不会那么麻烦没有实验。或许以后看见可能会试试。

         Over

点赞