我正在做一个 JavaScript 练习,但在理清其工作原理的逻辑时遇到了一些困难。它基本上有一个名为“mystery”的函数,它使用一堆非常简单的函数,并返回一个你给它的数组,但顺序相反。我在白板前坐了一个小时,试图找出其背后的逻辑,但没有明白。好心人能看一下这些函数并解释一下这个神秘函数如何返回一个反向数组吗?谢谢!
function rest(arr) {
return arr.slice(1);
}
function first(arr) {
return arr[0];
}
function conj(arr, value) {
arr.push(value);
return arr;
}
function mystery(array) {
if (array.length === 0) {
return [];
}
return conj(mystery(rest(array)), first(array));
}
最佳答案
神秘是一个递归函数。
它使用 rest
函数的返回值调用自身,该函数返回除第一个元素之外的所有内容。
它使用该结果 + first
的结果,返回第一个字符,并再次连接它们(使用 conj
),但第一个元素位于结束。
所以,假设您输入了 [He l l o],
它将返回conj(mystery([e l l o], H)
mystery([e l l o])
将返回 conj(mystery([l l o], e)
mystery([l l o])
将返回 conj(mystery([l o], l)
依此类推,直到进入mistery
的数组为空,在这种情况下递归结束,我们冒泡回到第一个调用。
旁注,递归经常用于这样的练习,但尽管它有一些特定的用途,但在许多情况下,不使用递归会更有效,因为与相比,进行另一个函数调用的开销相对困难。其他解决方案使用简单的循环来移动或交换项目。
如果输出一些信息,您可以看到发生了什么:
function rest(arr) {
return arr.slice(1);
}
function first(arr) {
return arr[0];
}
function conj(arr, value) {
arr.push(value);
return arr;
}
function mystery(array, level) {
if (array.length === 0) {
console.log('mystery level '+level+' is called with an empty array. Recursion ends here.. Stay tuned for the answer.');
return [];
}
console.log('mystery level '+level+' is called with '+array+
'. I will move '+first(array)+' to the end.');
var result = conj(mystery(rest(array), level+1), first(array));
console.log('returning '+result+' for level '+level);
return result;
}
console.log(mystery(['H','e','l','l','o'], 0));
关于javascript - 不知道为什么这个函数返回一个反转的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243401/