gpt4 book ai didi

Javascript 将方法链接到递归调用的结果

转载 作者:行者123 更新时间:2023-12-03 03:00:22 26 4
gpt4 key购买 nike

我试图从递归调用返回一个字符串,然后对其进行切片,但切片的行为很奇怪。

给定

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 使用连接器从数组值创建字符串

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"

切片是否参与递归调用?

最佳答案

首先,您的 first 函数有问题

// first :: [a] -> [a] WUPS
let first = arr =>
arr.slice(0, 1)

first 应该返回第一个元素,而不是包含第一项的单元素数组

// first :: [a] -> a
const first = xs =>
xs[0]
<小时/>

接下来,我们考虑完整的domain (输入)你的函数。您的函数接受一个字符串数组。该数组可以包含 0、1 或更多字符串,我们需要您的函数适用于所有情况 - codomain (输出)是字符串类型; join 应该始终返回一个字符串

// contract
join ([]) == ''
join ([a]) == a
join ([a,b]) == a + '-' + b
join ([a,b,c]) == a + '-' + b + '-' + c

在 JavaScript 中将其编码到递归函数中是微不足道的 - 请注意,无需跟踪数组索引或担心递增迭代器 - 只需考虑履行该契约即可

const first = xs =>
xs[0]

const rest = xs =>
xs.slice (1)

const join = xs => {
switch (xs.length) {
case 0: return ''
case 1: return first (xs)
default: return first (xs) + '-' + join (rest (xs))
}
}

console.log (join ([])) // ''
console.log (join (['a'])) // 'a'
console.log (join (['a', 'b'])) // 'a-b'
console.log (join (['a', 'b', 'c'])) // 'a-b-c'

或者,如果我们允许用户指定连接字符串,我们的功能当然可以得到极大的改进

const first = xs =>
xs[0]

const rest = xs =>
xs.slice (1)

const join = (y, xs) => {
switch (xs.length) {
case 0: return ''
case 1: return first (xs)
default: return first (xs) + y + join (y, rest (xs))
}
}

console.log (join ('&', [])) // ''
console.log (join ('&', ['a'])) // 'a'
console.log (join ('&', ['a', 'b'])) // 'a&b'
console.log (join ('&', ['a', 'b', 'c'])) // 'a&b&c'

关于Javascript 将方法链接到递归调用的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47426838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com