这种展平算法如何不忘记变量?
How does this flatten algorithm not forget the variable?
我正在弄乱一个数组,最后我写了这样的东西
const arr = [1,[[4,5],4,[9,8]]];
const result = [];
const flatten = arr =>
{
arr.forEach(elem =>{
if(Array.isArray(elem))
{
flatten(elem);
}
else{
result.push(elem);
}
})
return result;
}
console.log(flatten(arr))
然后我用谷歌搜索了解决方案,我找到了一个看起来更像这样的解决方案。
const arr = [1,[[4,5],4,[9,8]]];
const flatten = arr =>
{
let result = [];
arr.forEach(elem =>{
if(Array.isArray(elem))
{
result = result.concat(flatten(elem));
}
else{
result.push(elem);
}
})
return result;
}
console.log(flatten(arr))
如你所见,result
变量在函数中,但是函数是递归的,它是如何保存的?谢谢。
尝试 运行 此代码并按照日志进行操作。您将了解递归的工作原理。
const arr = [1,[[4,5],4,[9,8]]];
(flatten = arr =>
{
let result = [];
console.log(`initialized result for element ${arr} ${result}`)
arr.forEach(elem =>{
if(elem.length)
{ console.log(`updating result if we get an array ${result.length}`)
result = result.concat(flatten(elem));
console.log(`result updated in case of array ${result}`)
}
else{
console.log(`updating result if we get a number ${result.length}`)
result.push(elem);
console.log(`result updated in case of number ${result}`)
}
})
return result;
})(arr)
我正在弄乱一个数组,最后我写了这样的东西
const arr = [1,[[4,5],4,[9,8]]];
const result = [];
const flatten = arr =>
{
arr.forEach(elem =>{
if(Array.isArray(elem))
{
flatten(elem);
}
else{
result.push(elem);
}
})
return result;
}
console.log(flatten(arr))
然后我用谷歌搜索了解决方案,我找到了一个看起来更像这样的解决方案。
const arr = [1,[[4,5],4,[9,8]]];
const flatten = arr =>
{
let result = [];
arr.forEach(elem =>{
if(Array.isArray(elem))
{
result = result.concat(flatten(elem));
}
else{
result.push(elem);
}
})
return result;
}
console.log(flatten(arr))
如你所见,result
变量在函数中,但是函数是递归的,它是如何保存的?谢谢。
尝试 运行 此代码并按照日志进行操作。您将了解递归的工作原理。
const arr = [1,[[4,5],4,[9,8]]];
(flatten = arr =>
{
let result = [];
console.log(`initialized result for element ${arr} ${result}`)
arr.forEach(elem =>{
if(elem.length)
{ console.log(`updating result if we get an array ${result.length}`)
result = result.concat(flatten(elem));
console.log(`result updated in case of array ${result}`)
}
else{
console.log(`updating result if we get a number ${result.length}`)
result.push(elem);
console.log(`result updated in case of number ${result}`)
}
})
return result;
})(arr)