【发布时间】:2017-11-22 04:30:16
【问题描述】:
我试图从递归调用中返回一个字符串,然后对其进行切片,但是切片的行为很奇怪。
给定
let first = arr => arr.slice(0, 1)
let rest = arr => arr.slice(1)
let join = function join(arr, connector) {
return !arr.length ? '' : first(arr) + connector + join(rest(arr), connector)
}
let nums = [1, 2, 34, 45, 100]
其中 join 从数组值中创建一个字符串,并带有一个连接符 as
join(nums, '-')
返回
"1-2-34-45-100-"
然后切掉最后一个'-'
"1-2-34-45-100-".slice(0, -1)
返回
"1-2-34-45-100"
或
function f() {
return ("1-2-34-45-100-").slice(0, -1)
}
f()
返回 “1-2-34-45-100”
足够简单。那么为什么要在上述递归调用的结果中添加一个切片,比如
let join = function join(arr, connector) {
return ( !arr.length ? '' : first(arr) + connector + join(rest(arr), connector) )
.slice(0, -1);
}
生产这个?
join(nums, '-')
// -> "1-2-34-45"
// shouldn't this be "1-2-34-45-100" ?
甚至是陌生人,
join([1,2,3,4,5,6,7,8,9,10], '-')
// -> "1-2-3-4-5-6"
切片是否参与递归调用?
【问题讨论】:
-
您需要添加一些
console.logs,这样您才能看到正在发生的事情 - 或者更好的是,学习如何使用 javascript 调试器,例如 Chrome 附带的调试器。 -
你不认为 slice() 每次递归都会运行吗?它在每次通话时运行
-
@epascarello 这是我的假设。这是不正确的吗?如果是这样,我仍然无法对结果进行推理。
-
因为代码是这样的:
function join (...) { var x = ( !arr.length ? '' : first(arr) + connector + join(rest(arr), connector) ) .slice(0, -1); return x } -
对于 join() 的递归似乎也很奇怪......
标签: javascript recursion slice