斐波那契数列

文章目录

背景: 牛客网刷题看到算法-noob36 牛牛学数列5 ,这里提到了斐波那契数列。这个数列挺知名的,也很有趣。搜了下也看到了别人写过的相关博客。这里主要先记录三种基础解法,后期刷到专门考察DP(Dynamic Programing)、矩阵的时候,再回头更新此博客来补充相关解法。

一 、基础的三种解法(数组、交换、递归)

代码见gitee:
gitee提交记录,这个项目是记录牛客网探索过程

java 复制代码
 /**
     * 计算斐波那契数列
     * 牛客网 - noob36 牛牛学数列5
     * 斐波那契定义:  F(0)=0,F(1)=1,F(2)=1, ...... F(n)=F(n-1)+F(n-2)(n≥2)
     * 输入描述:在一行中输入一个整数 n,满足 1≦n≦46
     * 数列前几项为:0 1,1,2,3,8
     *
     * @param n
     * @retur 打印出第n项,也就是F(n),这里顺便打印出所有的计算结果,这样可以顺便观察计算规律
     */
    static String calculateFibonacci(int n) {
        //下面是我自己思考的第一种做法,定义个数组存储下所有计算结果,然后把计算的结果取出来即可
        if (n <= 2) {
            long[] fibonacciArray = new long[3];
            fibonacciArray[0] = 0;
            fibonacciArray[1] = 1;
            fibonacciArray[2] = 1;
            System.out.println(JSON.toJSONString(fibonacciArray));
            return JSON.toJSONString(fibonacciArray);
        } else {
            long[] fibonacciArray = new long[n + 1];
            fibonacciArray[0] = 0;
            fibonacciArray[1] = 1;
            fibonacciArray[2] = 1;
            for (int i = 3; i < (n + 1); i++) {
                fibonacciArray[i] = fibonacciArray[i - 1] + fibonacciArray[i - 2];
            }
            System.out.println(JSON.toJSONString(fibonacciArray));
            return JSON.toJSONString(fibonacciArray);
        }
    }

    /**
     * 看了题解和讨论后,发现网友的做法没有使用中间变量存储,使用交换计算的。
     * 这个想法很简洁,也值得照猫画虎下。
     *
     * @param n
     * @return
     */
    static String calculateFibonacciV2(int n) {
        //学习网友解法,使用变量交换计算。
        //这个集合只是存储最终结果,方便打印计算链数据而已。
        List<Long> result = new ArrayList<>();
        Long f1 = 1L;//上上一个值
        Long f2 = 1L;//上一个值
        result.add(f1);
        result.add(f2);
        if (n < 3) {
            return JSON.toJSONString(result);
        }
        for (int i = 3; i <= n; i++) {
            //核心代码------思路:动态交换
            long fn = f2 + f1;
            result.add(fn);
            f1 = f2;
            f2 = fn;
        }
        return JSON.toJSONString(result);
    }


    /**
     * 看基础解法里还有递归写法,按照这个思路实现下
     *
     * @param n
     * @return
     */
    static String calculateFibonacciRecursion(int n) {
        //学习网友解法,使用变量交换计算。
        //这个集合只是存储最终结果,方便打印计算链数据而已。
        List<Long> result = new ArrayList<>();
        long fiboResult = fibonacciRecursion(n);
        result.add(fiboResult);
        return JSON.toJSONString(result);
    }
java 复制代码
//测试结果如下:

//        calculateFibonacci(47);
        //输入:6  输出:[0,1,1,2,3,5,8]
        //输入47   输出:[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073]

/*
        String result = calculateFibonacciV2(47);
        System.out.println("斐波那契数列计算结果(变量交换): " + result);
*/
        // 输入:6 输出:斐波那契数列计算结果(变量交换): [1,1,2,3,5,8]
        //输入47 输出:斐波那契数列计算结果(变量交换): [1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073]


        //斐波那契数列-递归解法测试
        String result = calculateFibonacciRecursion(3);
        System.out.println("斐波那契数列计算结果(递归): " + result);
        //结果:斐波那契数列计算结果(递归): [8]

二、拓展衍生(动态规划、矩阵)-后续完善......

待后续补充......

2.1 动态规划(dp)

2.2 矩阵

三、拓展(后续完善......)

为提升刷题速度,这些衍生的内容后期的题目可能还会遇到,遇到了回头完善,不做过多的延伸。

3.1 兔子繁殖

复制代码
	后续补充......

3.2 爬楼梯

复制代码
后续补充......  
相关推荐
java1234_小锋3 小时前
Java高频面试题:JVM内存为什么要分代?
java·开发语言·jvm
筱砚.3 小时前
C++——lambda
开发语言·c++·算法
linux修理工4 小时前
下载亚马逊Corretto 17的方法(OpenJDK 17发行版)
java·运维·服务器
Eward-an4 小时前
LeetCode 76. 最小覆盖子串(详细技术解析)
python·算法·leetcode·职场和发展
guygg884 小时前
基于ADMM的MRI-PET高质量图像重建算法MATLAB实现
开发语言·算法·matlab
moonlight03044 小时前
类加载子系统
java·jvm·算法
baivfhpwxf20234 小时前
ACS X轴回零程序 项目实战版
网络·数据库·算法
xiaoye37084 小时前
某大厂java面试题一面20260313
java
一叶落4384 小时前
LeetCode 219. 存在重复元素 II(C语言详解)
算法·哈希算法·散列表
像污秽一样4 小时前
算法设计与分析-习题2.4
数据结构·算法·排序算法