gpt4 book ai didi

javascript - 变量赋值避免了无限循环

转载 作者:行者123 更新时间:2023-12-04 12:21:36 25 4
gpt4 key购买 nike

我有两段递归代码,打算递归打印出数组的一半,直到我们得到数组长度为 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]);

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

最佳答案

因为它缺少var , letconst , halfway 具有全局范围,就像您写了 window.halfway .结果,所有递归调用都修改并使用相同的单个变量。
第一个功能该值在第一次递归调用中被更改,然后才能在第二次递归调用中使用。在我的测试中,这实际上导致了一种堆栈溢出错误(或者更确切地说是最大调用堆栈大小错误),非常适合这个站点:-)。
第二功能在递归调用开始之前,该值被使用了两次,然后被两个人一个接一个地修改。
使用 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'; ,JS 编译器将检测并阻止整个问题。在您的代码之上。我真的不喜欢这个指令的笨拙工作方式(为什么在代码顶部放置一个“死的和未使用的”字符串会产生如此特殊和深远的影响?),但我们必须利用我们的可以得到。

关于javascript - 变量赋值避免了无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69014517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com