斐波那契数列

文章目录

背景: 牛客网刷题看到算法-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 爬楼梯

复制代码
后续补充......  
相关推荐
wostcdk2 小时前
筛质数汇总
数据结构·算法
不吃橘子的橘猫2 小时前
《集成电路设计》复习资料4(Verilog HDL概述)
学习·算法·fpga开发·集成电路·仿真·半导体
宇木灵2 小时前
C语言基础-五、数组
c语言·开发语言·学习·算法
想用offer打牌2 小时前
一站式了解接口防刷(限流)的基本操作
java·后端·架构
姜源Jerry3 小时前
【Trae】Trae IDE&SOLO浅尝
java·ide·ai
宇木灵3 小时前
C语言基础-三、流程控制语句
java·c语言·前端
xsyaaaan3 小时前
代码随想录Day39动态规划:115不同的子序列_583两个字符串的删除操作_72编辑距离_编辑距离总结
算法·动态规划
陈天伟教授3 小时前
人工智能应用- 人工智能交叉:05. 从 AlphaFold1 到 AlphaFold2
人工智能·神经网络·算法·机器学习·推荐算法
Eloudy3 小时前
直接法 读书笔记 05 第5章 正交方法
人工智能·算法·机器学习