变量赋值避免无限循环

2023-11-29

我有两段递归代码,打算递归地打印出数组的一半,直到到达数组长度为 1 的数组。没有变量赋值的代码无限运行,而有变量赋值的代码则按预期运行。

有任何线索说明为什么会出现这种情况吗?

无限运行,CAREFUL

function half(arr) {
  halfway = Math.floor((arr.length) / 2)
  console.log(arr)
  if (arr.length > 1) {
    half(arr.slice(0, halfway));
    half(arr.slice(halfway));
  }
  return
}

half([1, 2, 3, 4, 5]);

不会无限运行

function half(arr) {
  halfway = Math.floor((arr.length) / 2)
  console.log(arr)
  if (arr.length > 1) {
    var a = arr.slice(0, halfway);
    var b = arr.slice(halfway);
    half(a);
    half(b);
  }
  return
}

half([1, 2, 3, 4, 5]);

我认为也许某种可变性可能在这里发挥作用,但我无法想象如何运行效果。我认为每次调用函数时,我们实际上都会将一个全新的数组传递给函数......


因为它缺乏var, let and const, halfway具有全局范围,就像你写的那样window.halfway。因此,所有递归调用都会修改并使用相同的单个变量。

In the 第一个功能该值在第一次递归调用中发生更改,然后才能在第二次递归调用中使用。在我的测试中,这实际上导致了一种堆栈溢出错误(或者更确切地说是最大调用堆栈大小错误),非常适合此站点:-)。

In the 第二功能在递归调用开始之前,该值会被使用两次,然后两次调用都会对其进行修改。

通过使用解决的问题const:

function half1(arr) {
  const halfway = Math.floor((arr.length) / 2)
  console.log(arr.toString())
  if (arr.length > 1) {
    half1(arr.slice(0, halfway));
    half1(arr.slice(halfway));
  }
  return
}

function half2(arr) {
  const halfway = Math.floor((arr.length) / 2)
  console.log(arr.toString())
  if (arr.length > 1) {
    var a = arr.slice(0, halfway);
    var b = arr.slice(halfway);
    half2(a);
    half2(b);
  }
  return
}

const data = [1, 2, 3, 4, 5];
half1(data);
console.log("------------------------")
half2(data);

最后注意:如果你把'use strict';在你的代码之上。我真的不喜欢这个指令的工作方式是多么笨拙(为什么在代码顶部放置一个“死的和未使用的”字符串会产生如此特殊和深远的影响?),但我们必须利用我们的东西可以得到。

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

变量赋值避免无限循环 的相关文章

随机推荐

  • Websphere 8.5.5 上的 Spring Data JPA + Hibernate

    从 Tomcat 迁移到 WebSphere 时 我遇到了 Spring 4 Hibernate 项目无法正确加载的问题 我已经将应用程序设置为 PARENT LAST 类加载器 并将我的 Hibernate 版本恢复到 4 2 16 因为
  • 重复范围可替换为“*”是什么意思?

    我在 IntelliJ IDEA 中执行了代码分析器 它显示了弱警告 重复范围可由 替换 它在我使用正则表达式模式的下面代码行显示警告 String pattern prefix length suffix 我不确定我的代码在替换后是否可以
  • ORDER BY datetime 使查询非常慢

    我正在尝试从多个表中提取数据 当我使用 ORDER BY 日期时间字段时 它会在至少 10 秒后返回结果 但如果我在没有 ORDER BY 的情况下执行相同的查询 那么它会在 2 秒内返回结果 这是我当前的查询 SELECT ph call
  • 将字节数组转换为 Stream 时 ReadTimeout 引发异常

    我收到这个错误 ReadTimeout System IO Stream ms ReadTimeout threw an exception of type System InvalidOperationException 我的代码是 by
  • R Shiny - 将鼠标悬停在图标上时弹出窗口

    我想简单地在简单的文本行后面的图标上添加一个悬停窗口 我找到了shinyBS包 它似乎使这成为可能 但它链接到shiny输出 在闪亮的应用程序的 ui 中添加类似下面的代码可以使按钮正常工作 但在本例中它们链接到单选按钮 CVI lt c
  • Swift - 如何在迭代结构对象时改变它

    我仍然不确定结构复制或引用的规则 我想在从数组迭代结构对象时改变它 例如在这种情况下我想改变背景颜色 但编译器对我大喊大叫 struct Options var backgroundColor UIColor blackColor var
  • 如何将 Rails 助手导入到功能测试中

    你好 我最近继承了一个项目 其中前开发人员不熟悉 Rails 并决定将很多重要的逻辑放入视图助手中 class ApplicationController lt ActionController Base protect from forg
  • 使用单射函数的反值

    我试图证明这个引理 lemma assumes x inv f y and inj f and x undefined shows y range f using assms try 但 Nitpick 告诉我这个说法并不正确 Trying
  • 使用 Jasper Reports API 6.13.0 和 Adopt OpenJDK 11 编译 Jasper Reports 时出错

    我们有一个实用程序 CompileJasperReports jar 用于编译文件夹中找到的所有报告 当将 JasperReports 6 7 API 与 Java 8 结合使用时 该实用程序运行良好 通话内容是 C Program Fil
  • 从 htaccess 重写规则中排除多个路径

    我创建了一个新函数 希望能够实现面包屑和更好的 URL 结构 在此之前 我有以下规则 RewriteRule pages a z0 9 action viewArticleName page identifier 1 L NC QSA B
  • 如何在发布之前邀请用户测试附加组件?

    我目前正在开发一个 Gmail 插件 希望允许我团队内部的一些用户在公开发布之前测试该插件 我正在关注文档here来自谷歌指出 您可以允许其他用户通过与其帐户共享 Apps 脚本项目 需要读取权限 来测试该加载项 然后提示用户按照上述步骤操
  • 在 github 上启用 2FA 时使用密码代替令牌

    我最近在 github 上激活了 2FA 现在我所有计算机中的所有本地存储库都停止工作 我通过 https 使用它们 看来我必须切换到 SSH 或创建个人访问令牌 我的 git 设置的配置方式是 在进行拉 推时从不要求用户名 但总是要求密码
  • 我怎样才能加速这个 Rcpp 代码?

    我在 R 中实现了一个运行时间较长的函数 我已经成功地在 R 中改进了它 但现在我想通过使用 Rcpp 包来加快它的速度 我创建了以下 Rcpp 代码 不幸的是 它的运行时间与 R 代码的运行时间大致相同 我想因此改进它 有人知道如何改进这
  • 如何将新数组插入到我的锯齿状数组中

    你好 我将非常感谢任何帮助 好吧 让我们看看 首先我声明了一个像这样的锯齿状数组和下一个代码 int n 1 m 3 p 0 int jag array new n 现在我的锯齿状数组内部将有 1 个数组 接下来必须像这样填充数组 car
  • 如何在没有显式嵌套循环的情况下生成 N 个元素的组合,每个元素的供应有限

    如果 N 是固定的 比如 N 3 那么很容易 我可以使用深度为 3 的嵌套循环 例如 from i in Enumerable Range 0 2 from j in Enumerable Range 0 2 from k in Enume
  • CodeIgniter - 检查真实结果的最佳方法

    检查模型或其他任何地方的某些方法是否正确执行的最佳方法是什么 这是个好办法吗 Model data field1 this gt input gt post field1 data field2 this gt input gt post
  • BASH 脚本根据日期复制文件,但有一个问题

    让我解释一下树结构 我有一个网络目录 我们的数据库每天会多次复制新的 txt 文件 这些文件位于基于用户名的目录中 在本地磁盘上 我具有相同的结构 基于用户名的目录 并且需要使用最新的 txt 文件进行更新 这不是同步过程 我将远程文件复制
  • 列出 C# 中的 GetRange 错误

    我正在处理列表 我的列表有 14 条记录 List
  • 用于.Net项目的文档数据库/键值存储[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 是否有与 Net 项目配合
  • 变量赋值避免无限循环

    我有两段递归代码 打算递归地打印出数组的一半 直到到达数组长度为 1 的数组 没有变量赋值的代码无限运行 而有变量赋值的代码则按预期运行 有任何线索说明为什么会出现这种情况吗 无限运行 CAREFUL function half arr h