对称差分的递归函数
Recursive function for symmetric difference
我创建了一个函数来计算作为参数传递的数组之间的对称差。我对两个数组做了这样的处理,并且成功了。现在的问题是我想把这个函数扩展到n个变量。我认为我应该计算符号差,如果参数。函数的长度等于2,否则我应该调用递归函数来计算其他元素和前两个元素之间的符号差?我不知道,我很困惑。
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
}
相关文章:
- 递归函数中断
- 将jQuery对象传递到setTimeout递归函数中
- 对象与递归函数的比较
- 循环内部的递归函数未按预期工作
- 递归函数返回不正确
- 递归函数编程困境
- 给定一个带有数字的数组,我如何编写一个递归函数,当 2 个元素加起来为一个目标时,它会在数组中查找索引
- 返回不会退出 javascript 中的递归函数
- jquery递归函数转换为非递归函数
- AngularJS,promise带有递归函数
- 如何停止此递归函数
- 如何将下面的递归函数转换为纯函数
- jQuery setTimeout ajax递归函数在即时消息程序中短时间后抛出错误
- Javascript递归函数引用了这一点
- 如何将这个递归函数转换为迭代函数
- jQuery递归函数调用和Javascript之间有区别吗;s setInterval
- 从javascript中的递归函数获取undefined
- 将递归函数转换为异步 CPS 实现 (javascript)
- 我怎样才能把它变成一个循环,而不是一个递归函数
- 对称差分的递归函数