当前位置: 首页 > 知识库问答 >
问题:

变量赋值避免了无限循环

呼延卓
2023-03-14

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

有什么线索说明为什么会这样吗?

无限运行,小心

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]);

我以为这里可能存在某种可变性,但我无法想象会有什么连锁反应。我以为每次调用函数时,我们都会将一个全新的数组传递给它。。。

共有1个答案

巫晋鹏
2023-03-14

因为它缺少var、let和const,所以具有全局范围,就像您编写了窗口一样。中途。因此,所有递归调用都修改并使用相同的单个变量。

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

在第二个函数中,该值在递归调用开始之前使用两次,然后在两次调用之后都被修改。

使用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);
 类似资料:
  • 我是JQUERY新手,假设我在php中dd()后面有一个数组,它显示如下数组:1[0=>"1,18,187,188,189,190,191,192,194,199,196,199,199,199,200,201,202,204,205,206,207,208,209,210,211,212,19,20,21,22,23,24"]现在我喜欢循环数组,只传递那些大于200值;这是密码 其中#UserD

  • = 赋值操作符(它的左右两边不能有空白符) 不要搞混了 = 和 -eq,-eq 是比赋值操作更高级的测试。注意:等于号(=)根据环境的不同它可能是赋值操作符也可能是一个测试操作符。 例子 4-2. 简单的变量赋值 1 #!/bin/bash 2 # 裸变量 3 4 echo 5 6 # 什么时候变量是“裸”的?比如说,变量名前面没有$? 7 #当变量被赋值

  • 在for循环中为字符串定义值时遇到问题,但我需要它保持不变,即使在循环完成后也是如此。这是我的密码: 我知道如果我给soporte在for或if中赋一个值,它会改变,但我不知道如何做,因为它只是第一次问。还有,代码真的很长。这只是一个片段,所以有些东西是不完整的。P. D.apellido_1是用户的输入,但我使用了将要运行的示例。

  • 问题内容: 我只有一个班很多实例。每个实例都是其他几个实例的观察者。同样,每个实例也可以通过几个其他实例观察到。 如何避免在观察者中调用update()的无限循环? 问题答案: 您正在寻找一种检测循环的图遍历算法。一种简单的方法(仅在单线程方案中有效)是保持全局/静态计数器,以使每个顶级调用都获得唯一的标识符。然后,每个观察者都跟踪是否已经使用给定的标识符(ID)处理了更新,并且在这种情况下将其忽

  • 我的代码是这样的: 但最后一句话: 总是停止编译说我需要给新变量分配一个返回值?在if语句之前,已经为k分配了一个值。当我把随机k语句放在if语句中时,它似乎是有效的,但这使得它毫无价值,不是吗?编辑器本身没有错误,但是当我编译时,它给了我这个: 线程“main”java中出现异常。lang.IndexOutOfBoundsException:索引:41,大小:36。util。ArrayList。