通过使其成为包装器来优化斐波那契数列递归函数

2023-12-31

斐波那契数列的递归定义在效率方面存在问题。它的定义如下:

private fib(int n) {
    if(n < 2) return n;
    else return fib(n - 1) + fib(n-2);
}

假设我们调用 fib(5)。这使得 1 次调用 fib(4) 、2 次调用 fib(3) 、3 次调用 fib(2) 、5 次调用 fib(1) 和 3 次调用 fib(0) 。

在他的书中

Eric Roberts 的 Java 抽象编程

罗伯茨提到,我们可以通过认识到斐波那契数列只是斐波那契数列的一个特例来解决这个效率问题。additiveSequence(int n, int t0, int t1)方法。基本上,斐波那契数列只是一个严格以 0 和 1 开头的加法序列。有无数个序列符合斐波那契表达的递推关系。

作者解决效率问题如下:

private int fib(int n) {
    return additiveSequence(n, 0, 1);
}

所以我的问题是,通过将 fib 序列作为更通用的additiveSequence 方法的包装器,我们真的能提高效率吗?鉴于additiveSequence 的实现确实遵循相同的重复关系,那么在效率方面,additiveSequence 的实现是否不会与fib 具有相同的精确“问题”?


Here's an example implementation of an additive sequence calculation, where ti = ti-1 + ti-2:

int additiveSequence(int n, int t0, int t1) {
  if(n==0) return t0;
  if(n==1) return t1;
  return additiveSequence(n-1, t1, t0+t1);
}

This method returns the n-th value in the series. Work through some examples and you should be able to convince yourself that each ti will be calculated only once. Compare that with your naively implemented fib method and you can see why this approach is much faster.

The Fibonacci series is this kind of additive sequence, with the starting conditions t0 = 0 and t1 = 1. There's nothing particularly special about it, other than the fact that the obvious way to code it is a poor one. The author's point, presumably, is that implementation makes a huge difference in processing time. It does not appear to be clearly explained, however.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过使其成为包装器来优化斐波那契数列递归函数 的相关文章

  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • Numpy:具有特定条件的线性系统。无负解

    我正在使用 numpy 编写 Python 代码 在我的代码中 我使用 linalg solve 来求解 n 个变量中的 n 个方程的线性系统 当然 解决方案可以是积极的 也可以是消极的 我需要做的是始终有正解或至少等于 0 为此 我首先希
  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • 将整数列表划分为总和相等的 K 个子列表

    类似的问题还有1 https stackoverflow com questions 27322804 partition of a set into k disjoint subsets with equal sum and 2 http
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • 多维数组、Vuex 和变异

    我正在尝试添加和删除存储在 Vuex 中的多维数组中的项目 数组是一组类别 每个类别又有一个子类别 无穷大 不是简单的二维数组 示例数据集是这样的 id 123 name technology parent id null children
  • 如何设计一种算法来计算倒数式数学数字难题

    我一直想这样做 但每次我开始思考这个问题时 它的指数性质都会让我大吃一惊 我希望能够理解的问题解决器和代码是针对倒计时数学问题的 给定一组数字 X1 到 X5 计算如何使用数学运算将它们组合起来生成 Y 您可以应用乘法 除法 加法和减法 那
  • 如何在单向链表(一次遍历中)中从尾部获取第 n 个节点?

    所以我在一次考试中得到了这个问题 如何从单链表的尾部获取第 n 个节点 每个节点都有一个值和一个下一个 指向下一个值的指针 我们得到这个 getNodeFromTail Node head int x 所以我的做法是通过遍历一次来求出列表的
  • 如何在 JavaScript 中构建树模式匹配算法?

    好吧 这是一个有点复杂的问题 但是 tl dr 基本上是如何使用 模式树 解析 实际树 如何检查特定的树实例是否与特定的模式树匹配 首先 我们有我们的结构模式树 模式树通常可以包含以下类型的节点 sequence节点 匹配一系列项目 零个或
  • 素数生成器算法

    我一直在尝试解决素数生成算法的SPOJ问题 这是问题 彼得想为他的密码系统生成一些素数 帮助 他 你的任务是生成两个给定之间的所有素数 数字 Input 输入以单行中测试用例的数量 t 开始 t Output 对于每个测试用例 打印所有素数
  • 如何在不进行尾调用优化的情况下用函数式编程替代方案替换 while 循环?

    我正在 JavaScript 中尝试一种更实用的风格 因此 我用诸如map和reduce之类的实用函数替换了for循环 然而 我还没有找到 while 循环的功能替代品 因为尾部调用优化通常不适用于 JavaScript 据我了解 ES6
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • 使用 Python 的“哈密尔顿”路径

    我正在尝试使用 Python 实现遍历所有图顶点的任意路径 不一定是循环 的递归搜索 这是我的代码 def hamilton G size pt path if pt not in set path path append pt if le
  • 获取嵌套数组 JS 中对象的所有父对象

    我在使用 vuejs 的项目上遇到问题 我有一个像这样的嵌套对象数组 Data data id 1 parent id null title First folder children id 3 parent id 1 title Firs
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • 求 3D 棋盘中水体积的技巧

    所以我有一个任务 我必须重新创建一个 3D 棋盘 它是一个 RxC 方块网格 每个方块的高度都不同 如果棋盘是不透水的 有人把水倒在棋盘上 直到棋盘无法容纳更多的水 那么它就会容纳固定数量的水 如果板已经容纳了最大体积的水 则倒入板上的任何
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何计算 3D Morton 数(交织 3 个整数的位)

    我正在寻找一种快速计算 3D Morton 数的方法 这个网站 http www graphics stanford edu seander bithacks html InterleaveBMN有一个基于幻数的技巧来处理 2D Morto

随机推荐

  • 已 root 的 Galaxy S8 上的设备所有者

    我一直在尝试将我的内部演示应用程序提升为设备所有者rootedS8 一直有问题 我尝试过的方法 1 NFC 配置 如所解释的here https github com googlesamples android NfcProvisionin
  • 如何使用应用密码访问bitbucket

    我已经按照说明创建了应用程序密码here https confluence atlassian com bitbucket app passwords 828781300 html 但现在 我如何使用此应用程序密码访问存储库 网址是什么 有
  • 使用 C 无法从 TCP 套接字正确接收数据 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我使用的是 Ubuntu 12 04
  • 如果字符串出现在源(或差异)中,Git 在提交之前发出警告

    当我在某个场所进行表演时 我希望能够被阻止 git如果我要提交的更改包含某个字符串 例如 todo or hack 有人可以告诉我如何实现这一目标吗 或警告 或在提交时 一个简单的预提交钩子检查是否添加了字符串 todo 如下所示 bin
  • Chrome 扩展和 Javasctipy 数据库

    我正在尝试构建一个 Chrome 扩展程序 该扩展程序将大量使用数据和图像 在存储数据时我有哪些选择 我希望我有某种 SQL 选项 SQLite 你可以去base64 http en wikipedia org wiki Base64编码图
  • 在后台打开新标签页?

    使用 javascript 我想在不同的选项卡中打开一个新页面 但仍将注意力集中在当前选项卡上 我知道我可以这样做 open http example com focus 但是 当我在 Chrome 中执行此操作时 它会在切换回当前选项卡之
  • 无法以编程方式更改 UITextView 框架大小

    我已使用界面生成器在视图中插入 UITextView 现在我想更改其框架大小 以便以编程方式适合内容 问题在于 由于限制 大小似乎被锁定并且无法从代码中更改 如果我在文件检查器中禁用自动布局 每个对象都会删除约束 但我只想更改 UIText
  • “UnicodeEncodeError:‘ascii’编解码器无法对字符进行编码”

    我试图通过正则表达式传递大的随机 html 字符串 而我的 Python 2 6 脚本对此感到窒息 UnicodeEncodeError ascii 编解码器无法对字符进行编码 我追溯到这个词末尾的商标上标 Protection 我希望将来
  • 如何交互 BlazorWebView 和 Windows 窗体

    我想将数据从 Windows 窗体发送到 BlazorWebView 并接收从 Web 视图返回到窗体的通知 这个怎么做 在 Net 6 Windows 窗体应用程序中 BlazorWebView blazorApp new BlazorW
  • iPhone 中用于 AES 加密的不同填充模式和密码模式有哪些?

    iPhone 中用于 AES 加密的不同填充模式和密码模式有哪些 Thanks 有两种填充模式 PKCS 7 和无 以及两种相应的密码模式 CBC 和 ECB 如果您指定kCCOptionPKCS7Padding然后你会得到 CBC 并且如
  • 如何在 MySQL 中使用准备好的语句截断表?

    这返回 true 但它没有截断表 this gt db gt query TRUNCATE TABLE tablename 但它在为准备好的语句创建数据库连接对象之前起作用 如何修复它 另外 我想知道如何使用准备好的语句截断表 NO 准备好
  • djangorest框架创建带有密码的用户

    使用 django rest framework 3 和 django 1 8 我正在尝试使用 django rest framework ModelViewSerializer 创建用户 问题是DRF使用的默认objects create
  • 如何在 PostgreSQL 中对使用 date_trunc 函数的表达式创建索引?

    当我尝试在 PostgreSQL 中对类型的表字段的表达式创建索引时date 使用date trunc函数 我收到以下错误 functions in index expression must be marked IMMUTABLE 我该如
  • Webpack 4 devtool 选项不适用于 webpack-dev-server

    在我决定发布这个问题之前 我做了很多事情作为背景调查 所以 我的问题是 我使用 webpack v4 6 0 和 webpack dev server v3 1 3 他们一起工作得很好 但现在我正在尝试为我的应用程序设置源映射 似乎开发工具
  • 如何续订 Azure API 管理证书

    使用我们的 Azure API 管理端点配置的证书今天过期了 显然它的有效期只有一年 我们如何更新它 我们认为使用 MS 提供的默认 API 管理证书意味着我们不必手动担心更新它 但事实似乎并非如此 证书过期消息 https i stack
  • 我的 VBA Excel 宏中的防病毒误报

    我刚刚遇到了一个更烦人的问题 https stackoverflow com questions 3339136 antivirus false positive in my executable 突然 Windows Defender 开
  • Netbeans7.1 和 JavaFX 2.0 - FXML 代码完成不起作用

    我开始学习 JavaFX 2 0 并安装了 Netbeans 7 1 java 7 02 SDK 其中包含 JavaFX 2 一切似乎都正常 示例项目编译并运行良好 我的问题是 代码完成不适用于 FXML 文件 我按 ctrl space
  • Matlab 快速傅立叶变换 / fft 用于时间和速度

    我有一个 2 列向量 其中包含数据子集的时间和速度 如下所示 5 40 10 37 15 34 20 39 等等 我想要对速度进行傅立叶变换以获得频率 我将如何使用快速傅里叶变换 fft 来做到这一点 如果我的矢量名称是sampleData
  • Python - 处理混合编码文件

    我有一个文件 大部分是 UTF 8 但也有一些 Windows 1252 字符 我创建了一个表来将 Windows 1252 cp1252 字符映射到其 Unicode 对应字符 并希望使用它来修复错误编码的字符 例如 cp1252 to
  • 通过使其成为包装器来优化斐波那契数列递归函数

    斐波那契数列的递归定义在效率方面存在问题 它的定义如下 private fib int n if n lt 2 return n else return fib n 1 fib n 2 假设我们调用 fib 5 这使得 1 次调用 fib