斐波那契数列(Fibonacci)数列 c++详解
Fibonacci数列是一个在数学和计算机科学中非常著名的数列。这个数列以其特殊的递推关系而闻名,也因其在自然界中的多次出现而引人注目。
- 定义: Fibonacci数列的定义如下:
- F(0) = 0
- F(1) = 1
- 对于 n > 1,F(n) = F(n-1) + F(n-2)
- 数列开始: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
- 问题描述: Fibonacci问题通常指的是计算数列中的第n个数。
- 解决方法: 在代码中,我展示了三种常见的解决方法: a. 递归方法(fibonacciRecursive):
- 直接按定义实现,简单但效率低。
- 时间复杂度:O(2^n),空间复杂度:O(n)(递归栈深度)。
- 使用数组存储中间结果,避免重复计算。
- 时间复杂度:O(n),空间复杂度:O(n)。
- 只保存最近的两个数,进一步优化空间使用。
- 时间复杂度:O(n),空间复杂度:O(1)。
- 应用: Fibonacci数列在自然界和计算机科学中有许多应用:
- 描述某些植物的生长模式(如向日葵的种子排列)。
- 在算法分析中用于描述某些算法的时间复杂度。
- 在金融市场分析中用作技术指标。
- 有趣的性质:
- 相邻Fibonacci数的比值趋近于黄金比例(约1.618)。
- Fibonacci数列与Pascal三角形有密切关系。
Fibonacci问题是学习递归、动态规划和算法优化的好例子。它看似简单,但涉及了很多重要的编程和数学概念。
#include <iostream>
#include <vector>class FibonacciSolver {
public:// 递归方法计算Fibonacci数int fibonacciRecursive(int n) {if (n <= 1) return n;return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);}// 动态规划方法计算Fibonacci数int fibonacciDP(int n) {if (n <= 1) return n;std::vector<int> dp(n + 1, 0);dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}// 优化空间的动态规划方法int fibonacciOptimized(int n) {if (n <= 1) return n;int prev = 0, curr = 1;for (int i = 2; i <= n; i++) {int next = prev + curr;prev = curr;curr = next;}return curr;}
};int main() {FibonacciSolver solver;int n = 10; // 计算第10个Fibonacci数std::cout << "第" << n << "个Fibonacci数(递归方法): " << solver.fibonacciRecursive(n) << std::endl;std::cout << "第" << n << "个Fibonacci数(动态规划方法): " << solver.fibonacciDP(n) << std::endl;std::cout << "第" << n << "个Fibonacci数(优化方法): " << solver.fibonacciOptimized(n) << std::endl;return 0;
}
详细解释每种方法计算F(5)的过程
1.递归方法: 这个方法会显示递归调用的过程
计算 F(5)
计算 F(4)
计算 F(3)
计算 F(2)
计算 F(1)
计算 F(0)
计算 F(1)
计算 F(2)
计算 F(1)
计算 F(0)
计算 F(3)
计算 F(2)
计算 F(1)
计算 F(0)
计算 F(1)
结果: 5
2.动态规划方法: 这个方法会显示DP数组如何被填充:
DP数组初始化: 0 1 0 0 0 0
计算 F(2): 1, DP数组: 0 1 1 0 0 0
计算 F(3): 2, DP数组: 0 1 1 2 0 0
计算 F(4): 3, DP数组: 0 1 1 2 3 0
计算 F(5): 5, DP数组: 0 1 1 2 3 5
结果: 5
每个Fibonacci数只被计算一次,并存储在数组中。
3.优化空间的方法: 这个方法只保存最近的两个数:
初始状态: prev = 0, curr = 1
计算 F(2): 1 (prev = 0, curr = 1)
计算 F(3): 2 (prev = 1, curr = 1)
计算 F(4): 3 (prev = 1, curr = 2)
计算 F(5): 5 (prev = 2, curr = 3)
结果: 5
每一步只保存和更新两个变量,大大减少了空间使用。
- 递归方法简单直观,但有大量重复计算,效率最低。
- 动态规划方法避免了重复计算,效率高,但需要O(n)的额外空间。
- 优化空间的方法在保持高效的同时,将空间复杂度降到了O(1)。
相关文章:
斐波那契数列(Fibonacci)数列 c++详解
Fibonacci数列是一个在数学和计算机科学中非常著名的数列。这个数列以其特殊的递推关系而闻名,也因其在自然界中的多次出现而引人注目。 定义: Fibonacci数列的定义如下: F(0) 0F(1) 1对于 n > 1,F(n) F(n-1) F(n-2) 也就…...

第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)
第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。 本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、…...

家具购物小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,家具分类管理,家具新品管理,订单管理,系统管理 微信端账号功能包括:系统首页,家具新品,家具公告࿰…...
测试面试宝典(三十四)—— token是做什么用的?
Token 在软件系统中通常具有多种重要用途。 首先,它用于身份验证和授权。用户登录成功后,系统会生成一个唯一的 token 并返回给客户端,客户端后续的请求携带这个 token 来证明其身份和访问权限,避免了每次请求都需要重新输入用户…...

计算机网络基础:4.HTTP与HTTPS
一、回顾设定 想象你在经营一家繁忙的餐厅,顾客们通过点餐系统(网卡)下单,订单被前台(路由器)接收并分发到各个厨房区域(网络设备)。光猫像是食材供应商,通过高效的物流系…...

【深度学习入门】安装conda/miniconda、所需包类、CUDA与conda/Miniconda间的关系
深度学习入门 须知 本教程跟随李沐老师课程随笔,课程链接点击此处。 CUDA和Anaconda的关系 CUDA Toolkit是由Nvidia官方提供的完整工具包,其中提供了Nvidia驱动程序、开发CUDA程序相关的开发工具包等。 Anaconda在安装Pytorch等会用到的CUDA的框架时…...

0725,进程间传递文件描述符,socketpair + sendmsg/recvmsg
我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎…...

放大电路总结
补充: 只有直流移动时才有Rbe动态等效电阻 从RsUs看进去,实际上不管接了什么东西都能够看成是一个Ri(输入电阻) Ri Ui/Ii Rb//Rbe Ui/Us Ri/(RiRs) Aus (Uo/Ui)*(Ui/Us) Au *Ri/(RiRs) 当前面是一个电压源的信号 我们就需要输入电阻更大 Ro--->输出电阻--->将…...

深度学习1-简介
人工智能(AI)旨在打造模仿智能行为的系统。它覆盖了众多方法,涵盖了基于逻辑、搜索和概率推理的技术。机器学习是 AI 的一个分支,它通过对观测数据进行数学模型拟合来学习决策制定。这个领域近年来迅猛发展,现在几乎&a…...
Java基础语法 (基础介绍 二)
目录 Java 基础语法 第一个Java程序 基本语法 Java标识符 Java修饰符 Java变量 Java关键字 Java注释 Java 空行 Java 对象和类 Java中的对象 Java中的类 构造方法 创建对象 访问实例变量和方法 实例 源文件声明规则 Java包 Import语句 一个简单的例子 Java…...

SAPUI5基础知识18 - 自定义CSS和主题色
1. 背景 在上一篇博客中,我们通过使用SAPUI5提供的CSS类实现元素间距的调整。在本篇博客中,让我们看一下如何实现自定义的CSS样式。 2. 背景知识 2.1 CSS基础语法 CSS,全称为级联样式表(Cascading Style Sheets)&a…...
Postman中API测试的艺术:测试用例复用的高级技巧
Postman中API测试的艺术:测试用例复用的高级技巧 在API测试过程中,复用测试用例可以显著提高测试效率和一致性。Postman作为一个强大的API开发工具,提供了多种机制来实现测试用例的复用。本文将深入探讨Postman中API测试用例复用的技巧&…...
Flutter Geocoding插件使用指南:简化地理编码与逆地理编码
Flutter Geocoding插件使用指南:简化地理编码与逆地理编码 简介 geocoding 是一个Flutter插件,提供了简便的地理编码(将地址转换为经纬度坐标)和逆地理编码(将经纬度坐标转换为地址)功能。它利用了iOS和A…...

“手撕”全网最细的JDBC教程(安装导入使用)
目录 一、什么是JDBC 二、JDBC的安装 三、JDBC如何导入 四、怎么使用JDBC编写代码 一、什么是JDBC JDBC由Java提供给数据库的一组通用的API。 在平常的业务中,是比较少使用像cmd命令行来操作数据库的,更多的是操作代码(Pythonÿ…...

C++指针选择题带答案
1、有如下语句int a10,b20,*p1,*p2;p1&a;p2&b;如图1所示,若要实现图2所示的存储 结构,可选用的赋值语句是___________。 A)*p1*p2; B)p1p2; C)p1*p2; D)*p1p2; 2、变量的指针,其含义是该…...

力扣 二分查找
二分查找基础篇。 题目 class Solution {public int searchInsert(int[] nums, int target) {int l 0, r nums.length - 1;while(l < r) {int mid l((r-l)>>1);//(lr)/2if(nums[mid]<target)lmid1;else rmid-1;}return l;//处理边界,设定数组的左半…...
ADMAS-Simulink联合仿真输入设置
使用Solidworks、ADAMS、Simulink进行机电联合仿真_adams-simulink-CSDN博客RecurDynSimulink联合仿真案例演示_哔哩哔哩_bilibili# C#调用已经使用Python训练好的神经网络做图片检测_c#调用python训练好的神经网络模型-CSDN博客...

【NOI】C++程序设计入门三
文章目录 前言一、大杂烩1.导入2.常量3.标识符4.关键字5.整型补充5.1 short:短整型5.2 long:长整型5.3 long long:长长整型 二、例题讲解问题:1597. 买文具问题:1596. 火柴棒三角形问题问题:1417. 买文具问…...

Three.js投射光线实现三维物体交互
<template><div id"webgl"></div> </template><script setup> import * as THREE from three //导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入 dat.gui import { GUI } from thre…...

SSRF学习笔记
1.NAT学习 Nat(Network Address Translation,网络地址转换)是 一种网络通信技术主要用于将私有网络中的内部IP地址转换成公共网络中的公共IP地址,以实现局域网内部设备访问互联网的功能。具体来说,Nat有以下几个主要…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)
做RAG自己打算使用esmilvus自己开发一个,安装时好像网上没有比较新的安装方法,然后找了个旧的方法对应试试: 🚀 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana,适配中文搜索…...

docker容器互联
1.docker可以通过网路访问 2.docker允许映射容器内应用的服务端口到本地宿主主机 3.互联机制实现多个容器间通过容器名来快速访问 一 、端口映射实现容器访问 1.从外部访问容器应用 我们先把之前的删掉吧(如果不删的话,容器就提不起来,因…...