每日一练之斐波那契的实现

简介: 每日一练之斐波那契的实现

每日一练值斐波那契的实现

大家好,我是晓星航。今天为大家带来的是斐波那契数列题型的讲解!(Java版本)😀

斐波那契数列是什么?

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列: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*)在现代物理、准晶体结构、化学等领域,斐波那契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波那契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

斐波那契数列的数学关系(包含示意图)

我们通过数学归纳法归纳出一些规律:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N * )

斐波那契数列问题解法:

问题:求第n个斐波那契数列的值。

解法一 递归法:

我们先看图的解析来理解递归法

从上图我们可以知道所谓的递归就是先递后归,从后往前进行计算。

import java.util.Scanner;
public class TestDemo1 {
    public static int fib(int n){
        if (n == 1 || n == 2){
            return 1;
        } else {
            return fib(n - 1) + fib(n - 2);
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println(fib(n));
    }
}

此方法对于初学者来说容易想到 但是当要求的个数变大时,程序循行速度就会明显变慢。对此我们有什么更好地办法吗?答案是有,我们可以使用for循环来解决它!

解法二 循环(迭代)实现

我们可以推导出公式:

f3 = f1 + f2

f1 = f2

f2 = f3

 

由图可见我们法二的方法更加高效,即我们法二时间复杂度比法一要小。

import java.util.Scanner;
public class TestDemo1 {
    public static int fib2(int n){
        if (n == 1 || n == 2){
            return 1;
        } else {
            int f1 = 1;
            int f2 = 1;
            int f3 = 0;
            for (int i = 3; i <= n; i++) {
                f3 = f1 + f2;
                f1 = f2;
                f2 = f3;
            }
            return f3;
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println(fib2(n));
    }
}

总结:

相较于法一,我们法二for循环迭代方法的运行效率就高了一大截,如果小伙伴们以后参加面试,可一定一定一定要用方法二呀!(重要的事情只说三遍哦)

感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

目录
相关文章
|
7月前
牛客刷题之数学基础-快速幂
牛客刷题之数学基础-快速幂
39 0
|
1月前
|
Java Go C++
C/C++每日一练(20230426) 不喜欢带钱的小C、数组排序、超级素数
C/C++每日一练(20230426) 不喜欢带钱的小C、数组排序、超级素数
40 0
C/C++每日一练(20230426) 不喜欢带钱的小C、数组排序、超级素数
|
7月前
|
Python
牛客刷题之数学基础-约数
牛客刷题之数学基础-约数
30 0
|
算法 C语言 C++
【C语言蓝桥杯每日一题】——等差数列
这道题,我用到了C语言中的qsort库函数,它是一种基于快排算法思想的排序函数。首先,想让大家认识一下qsort库函数的大概样子,和如何使用。
131 0
|
机器学习/深度学习
华为机试每日一练--第六题: 蛇形矩阵
华为机试每日一练--第六题: 蛇形矩阵
华为机试每日一练--第六题: 蛇形矩阵
|
存储 C++
蓝桥杯练习题六 - 大数乘法(c++)
蓝桥杯练习题六 - 大数乘法(c++)
158 0
蓝桥杯练习题六 - 大数乘法(c++)
|
人工智能 算法 C++
每日算法刷题Day11-最大公约数、数组去重
⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。
95 0
每日算法刷题Day11-最大公约数、数组去重
|
算法
算法题每日一练---第60天:快速幂
快速幂是一种简单而有效的小算法。
158 15
算法题每日一练---第60天:快速幂
|
算法 索引
LeetCode每日一练(杨辉三角)
LeetCode每日一练(杨辉三角)
143 0
LeetCode每日一练(杨辉三角)
|
机器学习/深度学习
【牛客刷题】每日一练——自守数
【牛客刷题】每日一练——自守数
137 0