这是尾递归吗?

2024-03-06

我试图找到尾递归的例子,但我真的没有看到常规和尾递归之间的区别。如果这不是尾递归,有人能告诉我为什么不是吗?

public static long fib(long index) {

// assume index >= 0

if (index == 0) // Base case

  return 0;

else

  if (index == 1) // Base case

    return 1;

  else

    // Reduction and recursive calls

    return fib(index - 1) + fib(index - 2);

}  // end of method fib(long index)

不,问题中的方法不使用尾递归。尾递归很容易识别:递归步​​骤是last方法中发生的事情。

在你的代码中,after两个递归调用都结束,还需要执行一项操作 - 加法。所以方法是递归的, 但不是尾递归.

出于比较目的,这里是尾递归实现fib()方法 - 请注意我们如何需要传递额外的参数来保存递归的状态,更重要的是,请注意递归调用返回后没有任何操作需要执行。

public static long fib(int n, long a, long b) {
    return n == 0 ? b : fib(n-1, a+b, a);
}

像这样使用它:

fib(10, 1, 0) // calculates the fibonacci of n=10
=> 55

之前的实现在 n=92 以内都可以正常工作,对于更大的数字,您必须使用BigInteger代替long,并且更好地切换到迭代算法。

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

这是尾递归吗? 的相关文章

随机推荐

  • 为什么在ReactJS中按钮的onClick事件中传递函数引用而不是方法?

    每当我在按钮的 onClick 中传递函数括号时 即使不单击按钮 它也会在页面加载时自动调用 但是 当我不在按钮的 onClick 中传递函数括号时 它仅在单击按钮时调用 在函数调用中传递括号
  • 有人可以解释一下 Git 中使用的内容跟踪和其他 SCM 中使用的文件跟踪之间的区别吗

    我已经使用 Git 一段时间了 喜欢它所提供的功能和工作流程的灵活性 尽早并经常做出承诺的能力对我来说意义重大 而且非常适合我的工作方式 我曾多次听说过 Git 的一个功能 但我还没有弄清楚这一点 那就是它跟踪内容而不是文件历史记录 这应该
  • 返回 WCF 自定义错误异常

    我在从 wcf 服务返回自定义错误异常时遇到了一些问题 与 wcf 服务通信的客户端应用程序收到 合同不匹配错误 这是我在服务中定义的错误契约 public partial class Fault string codeField stri
  • 无法连接到 Raspberry Pi 上的 BLE 设备

    我正在尝试连接到 Raspberry Pi 2 上的 BLE 设备 心率传感器 Polar H7 我使用此处找到的最新版本的 bluez 5 35 http www bluez org download http www bluez org
  • Oracle 11g 支持的 JDBC、JDK 版本

    我们正在将数据库从 oracle 10g 升级到 11g 希望我们现在的JDK1 6能够支持这个 Oracle 11g 的理想 JDBC 版本是什么 目前我们使用的是ojdbc 14 jar 它支持11g吗 请确认我 根据甲骨文常见问题解答
  • 如何在 npm 模块上使用 Web Worker

    我正在编写一个 JavaScript 库 并且正在使用一个网络工作者 我正在使用 webpack 带有worker loader 来创建我的构建 图书馆一切正常 webpack config js test app worker ts in
  • 如何将QT国际化集成到CMake中?

    大家好 我正在尝试将 QT 国际化与 CMake 结合使用 我的 cmake 文件配置如下 Internalization this should generate core jp ts SET rinzo core TRANSLATION
  • 用于在函数上插入值的 cin 命令

    我怎样才能使用cin为函数插入值 cin gt gt addNumber cout lt lt addNumber lt lt endl 我不确定我是否正确使用了上面的这些行 我应该使用什么命令 单词或任何名称才能做到这一点 我正在尝试为变
  • 使用 Visual Studio 构建 UEFI 驱动程序

    我正在寻找有关如何使用 Visual Studio 2012 项目通过 EDK2 SDK 构建 UEFI 驱动程序的建议 我试图静态链接 UefiLib lib 但惨败 我已将该库添加到链接器下的附加依赖项中 include
  • 从 r 中的二高斯混合生成样本(MATLAB 中给出的代码)

    我正在尝试 在 r 中 创建与以下 MATLAB 函数等效的函数 该函数将从 N m1 s1 2 和 N m2 s2 2 与分数的混合物生成 n 个样本 alpha 来自第一个高斯 我有一个开始 但 MATLAB 和 R 之间的结果明显不同
  • Knockout 无法处理绑定

    当文本未定义时如何绑定文本 例如名称不可用 table class table thead tr th class col md 4 ID th th class col md 4 Name th tr thead tbody tr td
  • 使用 moment.js 进行 Jasmine 约会模拟

    我在应用程序中使用 moment js 来处理日期 时间 但它似乎与 Jasmine 的模拟功能配合得不好 我在下面整理了一个测试套件来显示我的问题 jasmine clock mockDate似乎暂时不起作用 但它可以很好地工作Date
  • 在 Android 中使用 DOM 解析器

    我使用 DOM 解析器从 XML 文件中检索信息 如下所示
  • 如何将所有提交从一个分支移动到另一个分支?

    场景是这样的 X1 X2 X3 X4 X5 X6 master D1 D2 D3 dev B1 B2 B3 bug1 我想将所有提交移至bug1分支到 master 分支并删除 bug1 分支 在这种情况下 X1 X2 X3 X4 X5 X
  • DataGrid 周围的 WPF ScrollViewer 影响列宽

    我使用 ScrollViewer 来滚动包含数据网格的用户控件时遇到问题 如果没有滚动查看器 列会按照我想要的方式填充数据网格 但是当添加滚动查看器时 列会缩小到约 15 像素 我能够简化我的布局 并且仍然可以重现这种行为 将数据网格宽度绑
  • 用户单击 Office 应用程序中的链接时未找到 OpenIdConnect 相关 Cookie

    我有一个使用 OpenIdConnect 向 Azure Active Directory 进行身份验证的应用程序 一切工作正常 除非我从 Office 应用程序 excel word 链接到我的网站 从这些应用程序中 我收到 异常 关联失
  • Typescript 泛型 keyof 与类型不匹配

    我有这个接口 它只存储另一个接口的密钥 modelKey 和该键的值 value interface ValueHolder
  • php cron 作业也执行 javascript

    我有一个运行 php 脚本的 cron 作业 但是我需要执行一些 html 和 javascript 才能使实际脚本正常工作 将 javascript 转换为 php 不是一个选项 基本上我需要它就像一个人在每次 cronjob 运行时正在
  • NSTableView 重绘不更新显示,选择粘贴

    尽管我知道这个问题的解决方案 但我很感兴趣是否有人可以向我解释这个解决方案 我也想把这个问题弄清楚 因为我在网上找不到任何关于这个问题的提及 而且我花了几天的时间才找到这个问题 我有一个 NSTableView 在重绘及其选择方面表现得很奇
  • 这是尾递归吗?

    我试图找到尾递归的例子 但我真的没有看到常规和尾递归之间的区别 如果这不是尾递归 有人能告诉我为什么不是吗 public static long fib long index assume index gt 0 if index 0 Bas