SOURCE

console 命令行工具 X clear

                    
>
console
function dataWarp(...num) {
  return num.map((a) => ({
      m: a+'',
      r: a
  }));
}

function calm(a,b) {
  var r = [
      {
          m: `(${a.m}+${b.m})`,
          r: a.r+b.r
      },
      {
          m: `(${a.m}-${b.m})`,
          r: a.r-b.r
      },
      {
          m: `(${b.m}-${a.m})`,
          r: b.r-a.r
      },
      {
          m: `(${a.m}*${b.m})`,
          r: a.r*b.r
      },
  ];
  a.r !== 0 && r.push({
      m: `(${b.m}/${a.m})`,
      r: b.r/a.r
  });
  b.r !==0 && r.push({
      m: `(${a.m}/${b.m})`,
      r: a.r/b.r
  });
  return r;
}

function allCalm(a,b,c,d,u) {
  var s = [], t = [];
  calm(a,b).forEach((i) => {
      s = s.concat(calm(i, c));
      t = t.concat(calm(i, d));
  });
  s.forEach((i) => {
      u = u.concat(calm(i, d));
  })
  t.forEach((i) => {
      u = u.concat(calm(i, c));
  });
  return u;
}

function get24(a,b,c,d) {
  console.time(`计算时间`);
  var result = [];
  [a,b,c,d]= dataWarp(a,b,c,d);
  allCalm(c,d,b,a,allCalm(b,d,a,c,allCalm(b,c,a,d,allCalm(a,d,b,c,allCalm(a,c,b,d,allCalm(a,b,c,d,[])))))).forEach((i) => {
      if (i.r === 24) {
        result.push(i.m + '');
      }
  })
  if (result && result.length === 0) {
    console.log(false);
  } else {
    console.log(true);
    console.log(`有${result.length}个,表达式如下:`, result.join('、'));
  }
  console.timeEnd(`计算时间`);
}

get24(3,4,5,6)
实现思路:
<ol>
	<li>先定义四张牌的数据结构,代码函数dataWarp</li>
	<li>假设只要两张牌,获取所有的计算结果的可能性,代码函数calm</li>
	<li>降维计算四张牌,保持a,b不变,组合c,d,代码函数allCalm,要保证a,b,c,d都计算到,则需要计算a,b,c,d; a,c,b,d; a,d,c,b; b,c,a,d; b,d,c,a; c,d,b,a;</li>
	<li>获取所有计算结果,匹配到等于24的数据,拉取出运算表达式</li>
</ol>

问题点:还要考虑4个数字重复的情况~