javascript - 不知道为什么这个函数返回一个反转的数组

标签 javascript arrays

我正在做一个 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/

相关文章:

arrays - Scala 数组泛型与向量泛型

javascript - 对象数组中属性值的递归数组

javascript - 将数据分组到单独的列表中

javascript - 如何使用 jQuery 检测点击但不拖动?

javascript - 获取 id 并将其传递给 ajax 的技术

javascript - 导航项 100% 分布在一个 div 中,填充均匀

javascript - 使用函数的上下文与将参数传递给函数

java - 如何在 Java 中存储(和读取)大型数组/映射/其他内容?

c++ - 如何将二维数组的字符串转换为每个字符数组?

C++从排序的对象数组创建排序数组的最佳方法