当前位置: 首页 > news >正文

利用“记忆化搜索“解斐波那契数

一、题目描述

求第 n 个斐波那契数。

二、 利用"记忆化搜索"解斐波那契数

什么是记忆化搜索?记忆化搜索就是带有备忘录的递归。

我们先来看一下使用递归来解斐波那契数的这个过程,假设求第5个斐波那契数F(5)。

 

由图可见,要重复计算很多次。

使用记忆化搜索(带有备忘录的递归)来解题时,便不会有重复计算。

如果有一个“备忘录”,我们每次向上返回结果之前,把结果存在“备忘录”一份,下次递归的时候,先看看备忘录,是否有我们需要的值,有的话,直接从备忘录里面取值,就不用再往下递归,便不会有重复计算。

 总结:如何实现记忆化搜索?

  1. 添加一个备忘录   <可变参数,返回值>(对于本题,使用数组即可,可变参数就是数组的下标,代表第几个斐波那契数;返回值就是第几个斐波那契数的值)
  2. 递归每次返回的时候,将结果放到备忘录里面
  3. 在每次进入递归的时候,往备忘录里面瞅一瞅

 三、解题代码

class Solution {//建一个备忘录,本题使用数组即可int[] memo = new int[31];public int fib(int n) {//初始化数组里面的值,应为下面递归不可能返回的值for(int i = 0; i < 31; i++) {memo[i] = -1;}return dfs(n);}public int dfs(int n) {//每次进⼊递归的时候,先去备忘录里面看看if(memo[n] != -1) {return memo[n];}if(n == 0 || n == 1) {//返回之前,要放在备忘录一份memo[n] = n;return n;}memo[n] = dfs(n-1) + dfs(n-2); //返回之前,要放在备忘录一份return memo[n];}
}

四、结果

 相关问题:

1、所有的递归(暴搜、深搜),都能改成记忆化搜索吗?

答:不是的,只有在递归过程中,出现了大量完全相同的问题时,才能用记忆化搜索的方式优化。

2、带备忘录的递归、记忆化搜索和动态规划其实都是一回事(本质相同:对解法的优化,把已经计算过的值给存起来)

 

相关文章:

  • Leecode---347:输出前k个高频元素(使用unordered_map)
  • [自动驾驶技术]-6 Tesla自动驾驶方案之硬件(AI Day 2021)
  • 计算机组成原理 第四章 存储器 Part 4 高速缓存存储器
  • 红队内网攻防渗透:内网渗透之windows内网权限提升技术:工具篇
  • React-生成随机数和日期格式化
  • nodemcu32s 和 mini D1 组局域网并用 webSocket 通信
  • 代码随想录算法训练营day24|回溯理论基础、77.组合
  • C/S模型测试
  • 轻松上手Jupyter Notebook:数据分析与可视化的终极指南
  • Django——Admin站点(Python)
  • Linux:confluence8.5.9的部署(下载+安装+破ji)离线部署全流程
  • 网卡配置基础知识
  • 【面试】介绍一下HotSpot虚拟机
  • Jenkins常用插件与应用详解
  • Python中Web开发-Django框架
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • bootstrap创建登录注册页面
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • canvas 高仿 Apple Watch 表盘
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • HTTP 简介
  • Java,console输出实时的转向GUI textbox
  • laravel with 查询列表限制条数
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Shell编程
  • Vim 折腾记
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 日剧·日综资源集合(建议收藏)
  • 使用权重正则化较少模型过拟合
  • 手机端车牌号码键盘的vue组件
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 交换综合实验一
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 选择阿里云数据库HBase版十大理由
  • # Panda3d 碰撞检测系统介绍
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (LeetCode 49)Anagrams
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计大学生兼职系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (译) 函数式 JS #1:简介
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • ****三次握手和四次挥手
  • ..回顾17,展望18