0

0

如何在Java中实现简单的斐波那契数列_递归与迭代的代码实现

P粉602998670

P粉602998670

发布时间:2026-02-12 15:57:10

|

606人浏览过

|

来源于php中文网

原创

递归实现斐波那契时间复杂度为指数级,因重复计算导致效率极低;迭代实现时间o(n)、空间o(1),推荐用于实际项目;int在n>46时溢出,需依需求换用long或biginteger;记忆化仅在多次不同n调用时有效。

如何在java中实现简单的斐波那契数列_递归与迭代的代码实现

递归实现 fibonacci:为什么越写越慢?

直接用递归写 fibonacci(n) 看似简洁,但时间复杂度是指数级的——fibonacci(40) 就要算上亿次调用。根本原因是重复计算:算 fibonacci(5) 时,fibonacci(3) 被算两次;算 fibonacci(10) 时,fibonacci(3) 被算几十次。

如果只是练手或 n ,可以这么写:

public static int fibonacci(int n) {
    if (n < 2) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}
  • 边界必须是 n (即 <code>n == 0 返回 0,n == 1 返回 1),错写成 n 逻辑不变,但可读性略差
  • 不处理负数输入的话,fibonacci(-1) 会无限递归栈溢出,加个 if (n 更稳妥
  • 别用 longBigInteger 递归——递归深度没变,只是延缓了溢出,没解决本质问题

迭代实现 fibonacci:怎么写才不容易错?

迭代是实际项目里该用的方式:时间 O(n),空间 O(1),且不会栈溢出。核心是只存最近两个值,滚动更新。

常见写法:

Qoder
Qoder

阿里巴巴推出的AI编程工具

下载

立即学习Java免费学习笔记(深入)”;

public static int fibonacci(int n) {
    if (n < 0) throw new IllegalArgumentException();
    if (n < 2) return n;
    int a = 0, b = 1;
    for (int i = 2; i <= n; i++) {
        int tmp = a + b;
        a = b;
        b = tmp;
    }
    return b;
}
  • 循环变量 i2 开始,对应算第 2 项(即 fibonacci(2) == 1),别从 01 起,容易多算或少算一轮
  • ab 的初始值必须是 fibonacci(0)fibonacci(1),顺序不能反,否则结果偏移
  • 如果需要返回前 n 项,就用 List<integer></integer> 收集,但注意 intn > 46 时就溢出了,这时候得切到 longBigInteger

int 溢出怎么办?什么时候该换类型?

int 最大值是 2147483647,而 fibonacci(47) == 2971215073,已经超了。运行时不会报错,只会静默溢出变成负数——比如 fibonacci(47) 返回 -1323752223

  • 如果明确要支持 n ,改用 <code>long 即可(fibonacci(93) 才超 long
  • 若需求是“任意大的 n”,必须用 BigInteger,但要注意:它不可变,每次加法都新建对象,性能比 long 差一个数量级
  • 别在迭代里混用类型:比如 aintblong,容易因自动提升引发隐式截断

要不要加缓存?memoization 在什么场景真有用?

纯递归加缓存(记忆化)能把时间压到 O(n),但它只在「多次调用不同 n 值」时才划算。比如你反复调用 fibonacci(10)fibonacci(15)fibonacci(10),缓存才有意义。

  • 单次调用 fibonacci(100),缓存数组要开 101 个槽,不如直接迭代省空间
  • 缓存用 int[] memo = new int[n + 1] 最简单,但要注意初始化:全填 -1,因为 fibonacci(0) == 0 是合法值,不能用 0 当“未计算”标记
  • 并发环境下别直接共享 memo 数组,除非加锁或改用 ConcurrentHashMap

边界小、调用散、又懒得改迭代逻辑时,缓存递归是折中选择;其他情况,迭代更干净利落。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

806

2023.08.22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

708

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

559

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

206

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

410

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

587

2023.08.10

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

54

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

154

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.3万人学习

Java 教程
Java 教程

共578课时 | 64.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号