数据结构与算法10 - 斐波那契数列Fibonacci

Fibonacci数列特点
头两个元素都为1
从第三个元素起,当前元素数值为前两个元素的数值和
例如:1, 1, 2, 3, 5, 8, 13 .........


总结了四种方法生成Fibonacci数列 - 有3种是递归、有1种不使用递归

public class FibonacciUtil {

    // 返回斐波那契数列第index个位置的数字
    public static int fiboNum(int index) {

        if(index == 1 || index == 2) {
            return 1;
        }else {
            return fiboNum(index-1) + fiboNum(index-2);
        }

    }


    /**
     *
     * @param length   斐波那契数列的长度
     * @param fiboArr  保存到某个固定长度空数组中 - length与foboArr长度必须对应
     * @return  返回的还是形参fiboArr对象
     */
    public static  int[]  fibonacci(int length, int[] fiboArr) {

        if(length == 1 ) {
            fiboArr[0] = 1;
        }else if(length == 2 ) {
            fiboArr[0] = 1;
            fiboArr[1] = 1;
        }else {
            fiboArr[length-1] = fibonacci(length-1, fiboArr)[length-2] + fibonacci(length-2, fiboArr)[length-3];
        }
        return fiboArr;
    }

    /**
     *
     * @param length
     * @return 返回一个length长的fibonacci数组
     */
    public static int[] fibonacci2(int length) {

        int[] fibos = new int[length];
        for(int index = 0; index<length; index++) {
            fibos[index] = fiboNum(index+1);
        }

        return fibos;
    }

    /**
     *
     * @param maxValue 斐波那契数列最后一个元素 大于 等于该元素
     * @return
     */
    public static Integer[] fibonacci3(int maxValue) {

        List<Integer> fiboList = new ArrayList<>();

        int length = 1;
        while(true)  {
            int fiboNum = fiboNum(length);
            fiboList.add(fiboNum);

            if(fiboNum >= maxValue)
                break;
            length++;
        }

        Integer[] fiboNums = new Integer[fiboList.size()];

        return fiboList.toArray(fiboNums);

    }


    /**
     * 不使用递归
     * @param length
     * @return 返回一个length长的fibonacci数组
     */
    public static int[] fibonacci4(int length) {

        int[] fiboNums = new int[length];

        if(length > 0) {
            fiboNums[0] = 1;
        }

        if(length > 1) {
            fiboNums[1] = 1;
        }

        if(length > 2) {
            int index = 2;
            while(true) {
                fiboNums[index] = fiboNums[index-1] + fiboNums[index-2];
                if(index+1 == length)
                    break;
                index++;
            }
        }
        return fiboNums;
    }



    public static void main(String[] args) {

        int[] fibonacci = fibonacci(10, new int[10]);

        System.out.println(Arrays.toString(fibonacci));

        int[] fibonacci2 = fibonacci2(10);

        System.out.println(Arrays.toString(fibonacci2));

        Integer[] fibonacci3 =  fibonacci3(100);

        System.out.println(Arrays.toString(fibonacci3));

        int[] fibonacci4 = fibonacci4(10);

        System.out.println(Arrays.toString(fibonacci4));

    }

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PK0vWVUf-1587794365013)(en-resource://database/32200:1)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值