gpt4 book ai didi

javascript - 对称差的递归函数

转载 作者:行者123 更新时间:2023-12-02 13:56:45 25 4
gpt4 key购买 nike

我创建了一个函数来计算作为参数传递的数组之间的非对称差异。我对两个数组做了它并且它有效。现在的问题是我想将函数扩展到 n 个变量。我认为如果函数的arguments.length等于二,我应该计算对称差,否则我应该调用递归函数来计算其他元素与前两个元素之间的对称差?我不知道,我很困惑。

function sym(args) {

var arr=[].slice.call(arguments);
var cnts={};
var result=[];

if(arguments.length==2){

arr=arguments[0].concat(arguments[1]);
console.log(arr);
for(var number in arr){

if(cnts.hasOwnProperty(arr[number])){

++cnts[arr[number]].cnt;

}

else cnts[arr[number]]={cnt:1,val:arr[number]};

}

for(var counts in cnts){

if(cnts[counts].cnt===1) result.push(cnts[counts].val);

}

}

else{

var first=arguments[0];
var nextDiff=function(next){

return ...........?????????;

};

}

return result;
}

sym([1, 2, 5], [2, 3, 5], [3, 4, 5]);

最佳答案

这里有两个关键的见解。第一个是我们有

sym_diff(A1, A2, ..., An) === sym_diff(sym_diff(A1, A2), A3, ..., An)

这是因为对称差是关联的并且允许我们重复出现。

第二个是

sym_diff(A, B) === diff(A, B) ++ diff(B, A)

这里的++表示并集,diff表示通常的相对差异。

因此:

function sym_diff() {
// Convert the passed arguments to an array for convenience
let args = Array.prototype.slice.call(arguments);

// This is an example of an immediately-invoked function expression
// (IIFE). Basically, we define a function and then immediately call it (see * below)
// in one go and return the result

return (function sym_diff(a, b) {
// a: the first argument
// b: an array containing the rest of the arguments

if (!b.length) {
// If only a is given, return a if is an array, undefined otherwise
return Array.isArray(a) ? a : undefined;
}
else if (b.length === 1) {
// Define a function that takes two arrays s and t, and returns
// those elements of s that are not in t. This is an
// example of arrow notation`
let diff = (s, t) => s.filter(i => t.indexOf(i) === -1);

// Use the second insight to compute the sym_diff of a and
// b[0]
return diff(a, b[0]).concat(diff(b[0], a));
}
else {
// Use the first insight to recursively compute the sym_diff
// We pass [b[0]] because sym_diff expects an array of arrays as the second argument
// b.slice(1) gives all of b except the first element
return sym_diff(sym_diff(a, [b[0]]), b.slice(1));
}
})(args[0], args.slice(1)); //* Here is where we pass the arguments to the IIFE
}

关于javascript - 对称差的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40644303/

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