2016-11-16 43 views
0

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

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]); 
+0

[试图解决使用Javascript对称差(的可能的复制http://stackoverflow.com/questions/30834946/trying-to-solve-symmetric-difference-using-javascript ) –

回答

2

这里有两个关键的见解。首先是我们有

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 
} 
+0

谢谢!你能解释我更多关于这个代码吗?我开始了,我不太了解。例如.. sym_diff调用中的b是什么?它需要除第一个之外的所有参数? – Juan

+1

我向代码添加了一些注释。希望有所帮助。 –