我有两段递归代码,打算递归地打印出数组的一半,直到到达数组长度为 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(使用前将#替换为@)