2016-11-16 9 views
0

引数として渡された配列間の対称差を計算する関数を作成しました。私は2つの配列のためにそれをし、それは働いた。今の問題は、関数をn個の変数に拡張したいということです。関数のarguments.lengthが2に等しい場合、symmの相違を計算する必要があると思います。そうでなければ、他の要素と最初の2つの間のsymm diffを計算する再帰関数を呼び出す必要があります。私は知らない、私は非常に混乱しています。対称差分の再帰関数

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

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

私はコードにいくつかのコメントを追加しました。希望が役立ちます。 –