javascript - 不知道为什么这个函数返回一个反向数组
问题描述
我正在做一个 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));
}
解决方案
神秘是一个递归函数。
它使用函数的返回值调用自身,该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));
推荐阅读
- xamarin.forms - 为 CarouselViewControl 实现 SelectedItem
- mysql - sql中的正确连接没有按预期给出答案
- linux - 使用 bash、awk 或 sed 将 CSV 文件模板化为 SQL 文件
- excel-formula - vlookup 使用表格搜索数据并从数组中返回结果
- apache-nifi - 如何为自定义处理器生成使用文档
- excel - 我正在尝试使用 xlrd 检测 excel (.xlsx) 文件中单元格背景的颜色,但我似乎无法成功
- git - 如何在 gitignore 中选择多个相同格式的文件,但特定名称除外
- ruby-on-rails - Rails ajax 调用路由到错误的控制器操作
- html - 2 个 div 相互对齐并在视口中居中停止在较小的视口中对齐
- typescript - 是否建议发布 TypeScript 节点模块的源文件?