Javascript 递归与数组

Javascript 递归与数组,javascript,arrays,recursion,Javascript,Arrays,Recursion,每当我返回我的答案不在数组中时,我必须使用递归将给定数组按2的集合分组 我创建了一个数组,然后返回该数组 输入:[5,1,4,2,3] 预期产出:[[5,1],[1,4],[4,2],[2,3]] 实际输出:5,11,44,22,3您可以使用而不是+,来修复该函数: 函数对{ 如果xs.length您可以通过使用而不是+来修复函数: 函数对{ 如果xs.length则错误在于+。数组的总和不是那样的。+将把数组操作数转换为字符串,然后将它们串联起来。而使用扩展语法或concat来串联数组 但

每当我返回我的答案不在数组中时,我必须使用递归将给定数组按2的集合分组

我创建了一个数组,然后返回该数组

输入:[5,1,4,2,3]

预期产出:[[5,1],[1,4],[4,2],[2,3]]


实际输出:5,11,44,22,3

您可以使用而不是+,来修复该函数:

函数对{
如果xs.length您可以通过使用而不是+来修复函数:

函数对{ 如果xs.length则错误在于+。数组的总和不是那样的。+将把数组操作数转换为字符串,然后将它们串联起来。而使用扩展语法或concat来串联数组

但是对于递归部分,我将进行两个递归调用,每个调用在数组的一半上。这样,递归堆栈将使用Ologn空间而不是on,这是防止堆栈溢出的一个很好的安全措施。请参阅例如具有100000个值的数组的区别

函数对{ 如果xs.length>1; return[…pairsxs.0,i, xs.i-1,i+1, …成对切片]; } } console.logpairs[5,1,4,2,3];错误在于+。数组不是这样加起来的。+将把数组操作数转换成字符串,然后将它们连接起来。而使用扩展语法或concat连接数组

但是对于递归部分,我将进行两个递归调用,每个调用在数组的一半上。这样,递归堆栈将使用Ologn空间而不是on,这是防止堆栈溢出的一个很好的安全措施。请参阅例如具有100000个值的数组的区别

函数对{ 如果xs.length>1; return[…pairsxs.0,i, xs.i-1,i+1, …成对切片]; } }
控制台.日志对[5,1,4,2,3] 您可以像这样使用concat函数concat两个数组

function pairs(xs) {
    if (xs.length <= 1){
        return [];
    } else {

        let [first,second,...rest] = xs;
        let result = [first,second];
        let newxs = xs.slice(1);
        return [result].concat(pairs(newxs));
    }
}

您可以像这样使用concat函数concat两个数组

function pairs(xs) {
    if (xs.length <= 1){
        return [];
    } else {

        let [first,second,...rest] = xs;
        let result = [first,second];
        let newxs = xs.slice(1);
        return [result].concat(pairs(newxs));
    }
}

请注意,每次调用JavaScript数组片段时,它都会生成一个新的片段副本。如果你想更有效一点,可以使用索引。比如:

函数fA,i=0{ 如果i>=A.length-1 返回[] 返回[[A[i],A[i+1]]]。concatfA,i+1 }
stringifyf[5,1,4,2,3]注意,每次调用JavaScript数组片段时,它都会生成一个新的片段副本。如果你想更有效一点,可以使用索引。比如:

函数fA,i=0{ 如果i>=A.length-1 返回[] 返回[[A[i],A[i+1]]]。concatfA,i+1 }
console.logJSON.stringifyf[5,1,4,2,3]输入是什么?不能将+与数组一起使用。要连接数组,您需要使用concatt。这不是真正的分组,因为您将相同的值放在两对中。输入是什么?您不能将+与数组一起使用。要连接数组,您需要使用concatt。这实际上不是分组,因为您将相同的值放在两对中。