パラレルセット(バイナリツリーDFS)

1917 ワード

質問:2つのローカルセットの合計が同じ場合、
YESなしでNOを出力
function solution(numbers) {
        let answer = "NO";
        let set = Array.from({ length: numbers.length }, (v) => 0);
        let flag = 0;
        const total = numbers.reduce((pre, cur) => pre + cur, 0);
        function DFS(L) {
          if (flag) return;
          if (L === numbers.length) {
            const setSum = set.reduce((pre, cur) => pre + cur, 0);
            
            if (total - setSum === setSum) {
              flag = 1;
              return (answer = "YES");
            }
            return;
          } else {
            set[L] = numbers[L];
            DFS(L + 1);
            set[L] = 0;
            DFS(L + 1);
          }
        }
        DFS(0);
        return answer;
      }
集合[1,3,5,6,7,10]が与えられた場合,まずすべての数を含む集合と集合から比較を開始する.
関連しているので、一部集合を求めるだけです.
  • total-setSum==setSumと判別すればよい
    再帰関数に加えて,初期集合の要素数をゼロに初期化する局所集合を定義し,
  • >flag変数を使用する理由は、同じ状況が見つかってもスタックフレームに再バインド可能な関数がいくつか存在するため、すぐに終了することができるからです。


    しかし、上のコードは少し味のあるコードで、もっと効果的なのは2つのパラメータを使うことです。


    以下は講師のコードです

          function solution(numbers) {
            let answer = "NO";
            let flag = 0;
            const total = numbers.reduce((pre, cur) => pre + cur, 0);
            function DFS(L, sum) {
              // if (flag) return;
              if (L === numbers.length) {
                if (total - sum === sum) {
                  flag = 1;
                  return (answer = "YES");
                }
                return;
              } else {
                DFS(L + 1, sum + numbers[L]);
                DFS(L + 1, sum);
              }
            }
            DFS(0, 0);
            return answer;
          }
    DFS(0,0)の最初のパラメータはindexです
    L+1の場合L次インデックスの処理
    L+1===numbers.length時に停止した原因は
    与えられた配列.lengthが5であると仮定すると、DFS(5)において配列の最後のインデックス4が処理されるからである.