首页 > 解决方案 > 不知道为什么这个函数返回一个反向数组

问题描述

我正在做一个 JavaScript 练习,并且在解开它为什么起作用的逻辑时遇到了一些麻烦。它基本上有一个名为“神秘”的函数,它使用一堆非常简单的函数,并返回一个你给它的数组,但顺序相反。我已经坐在白板前一个小时试图弄清楚它背后的逻辑,但没有得到它。好心人能看看这些函数,解释一下这个神秘函数是如何返回一个反转数组的吗?谢谢!

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));
}

标签: javascriptarrays

解决方案


神秘是一个递归函数。

它使用函数的返回值调用自身,该rest函数返回除第一个元素之外的所有内容。

它使用那个的结果 + 的结果first,它返回第一个字符,并再次连接它们(使用conj),但第一个元素在末尾。

所以,假设你输入 [你好],

它会回来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));


推荐阅读