递归之斐波那契数列java的3种方法

递归之斐波那契数列Java的3种方法

什么是斐波那契数列

在数学中,斐波那契数列是以递归的方式定义的:前两个数字是0和1,随后每个数字都是前两个数字的和。

斐波那契数列的前几个数字是0、1、1、2、3、5、8、13、21、34……以此类推。

三种递归方法实现斐波那契数列

方法1:最基本的递归方法

这是最基本的递归方法,但是由于重复计算太多,不适合大规模的计算,速度很慢。

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

方法2:加入缓存的递归方法

我们可以使用一个数组来存储每个子问题的解,避免了重复计算。这种方法被称为“记忆化搜索”或“自顶向下的动态规划”,速度较上一个方法提高了很多。

public static int fib2(int n) {
    int[] cache = new int[n + 1];
    return fib2Helper(cache, n);
}

private static int fib2Helper(int[] cache, int n) {
    if (n <= 1) {
        return n;
    } else if (cache[n] != 0) {
        return cache[n];
    } else {
        int result = fib2Helper(cache, n - 1) + fib2Helper(cache, n - 2);
        cache[n] = result;
        return result;
    }
}

方法3:非递归方法

我们也可以使用非递归方法来计算斐波那契数列。这个方法使用了一个数组来存储每个子问题的解,避免了重复计算。这种方法被称为“自底向上的动态规划”,速度是最快的。

public static int fib3(int n) {
    int[] fib = new int[n + 1];
    fib[0] = 0;
    if (n > 0) {
        fib[1] = 1;
        for (int i = 2; i <= n; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
    }
    return fib[n];
}

示例说明

示例1

我们要求斐波那契数列的第10项,可以调用方法1:

int result = fib1(10);
System.out.println(result);

输出为55。

示例2

我们要求斐波那契数列的第20项,可以调用方法3:

int result = fib3(20);
System.out.println(result);

输出为6765。

阅读剩余 47%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:递归之斐波那契数列java的3种方法 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • javascript中递归函数用法注意点

    JavaScript中递归函数是一种常用的技巧,它可以帮助我们解决很多复杂的问题。在使用递归函数时,需要注意以下几点: 1. 设定递归终止条件 递归函数需要明确的终止条件,否则可能会陷入死循环。通常情况下,递归终止条件是一个满足特定条件的简单问题,比如到达了数组的最后一个元素或是某个数值小于某个值。以下是一个求阶乘的递归函数示例,其中设定了 n = 1 时的…

    other 2023年6月27日
    00
  • Linux网络启动问题:Device does not seem to be present解决办法

    Linux网络启动问题:Device does not seem to be present 是指在Linux系统启动时,某些网卡设备无法被正常识别导致无法正常连接网络。本文将提供解决此类问题的完整攻略。 问题背景 当我们使用Linux系统时,经常会遇到无法正常连接网络的情况,常见的错误提示信息为:Device does not seem to be pre…

    other 2023年6月27日
    00
  • opencv学习笔记07addweighted()函数

    下面是关于“opencv学习笔记07addweighted()函数”的完整攻略: 1. addWeighted()函数说明 addWeighted()函数是OpenCV中的函数,用于将两个图像进行加权融合。该函数可以用于图像叠加、图像混合、图像融合等应用场景。 addWeighted()函数的语法如下: cv2.addWeighted(src1, alpha…

    other 2023年5月7日
    00
  • 安装win10系统出现占用硬盘空间过多的问题怎么解决

    解决Win10系统占用硬盘空间过多的问题攻略 1. 清理临时文件和回收站 Win10系统会生成大量的临时文件和回收站文件,占用硬盘空间。清理这些文件可以有效释放硬盘空间。 步骤: 打开“文件资源管理器”(快捷键:Win + E)。 在左侧导航栏中,选择“此电脑”。 右键点击系统安装盘(通常是C盘),选择“属性”。 在“常规”选项卡中,点击“清理磁盘”按钮。 …

    other 2023年8月1日
    00
  • Linux shell利用sed如何批量更改文件名详解

    下面是“Linux shell利用sed如何批量更改文件名详解”的完整攻略: 1. sed命令简介 sed是一种文本处理工具,主要用于文本替换、删除、查询、添加等操作。sed具有不修改原文件的特点,可以直接读取文件内容,按照指定的规则进行操作,将结果输出到标准输出或者保存到一个新文件中。sed主要使用正则表达式进行匹配和替换。 2. 使用sed批量更改文件名…

    other 2023年6月26日
    00
  • c++ 类中const成员变量的赋值方法

    让我来详细讲解C++类中const成员变量的赋值方法。 什么是const成员变量 在C++类中,可以使用const关键字定义类的成员变量。const关键字用于指定成员变量的值一旦被初始化就不可改变。这意味着在类的生命周期内,const成员变量的值不会被修改。 例如,我们可以定义一个类Person,其中包含一个const成员变量age: class Perso…

    other 2023年6月26日
    00
  • 关于qt:qmlpopup:知道它是如何关闭的

    以下是关于“关于Qt: QML Popup: 知道它是如何关闭的”的完整攻略,包含两个示例。 关于Qt: QML Popup: 知道它是如何关闭的 在Qt中,我们可以使用QML Popup组件来显示弹出窗口。在使用QML Popup组件时,我们需要知道如何关闭它。以下是关于如何关闭QML Popup组件的详细攻略。 1. 使用close()关闭Popup 在…

    other 2023年5月9日
    00
  • linux下安装wireshark

    Linux下安装Wireshark Wireshark是一个功能强大的网络协议分析工具,在Linux下的安装过程相对简单。本文将提供一种在Debian/Ubuntu以及CentOS/RHEL系统下安装Wireshark的方法,希望对您有所帮助。 1. 在Debian/Ubuntu系统下安装Wireshark 在Debian和Ubuntu系统下,可以通过apt…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部