当前位置:首页 > JavaScript

js实现24点算法

2026-04-04 22:36:29JavaScript

24点算法实现思路

24点游戏要求通过加、减、乘、除四则运算,使用给定的4个数字计算出24。JavaScript实现可以通过递归或穷举所有可能的运算组合来找到解法。

基本算法步骤

生成所有数字排列组合 利用递归或交换法生成4个数字的全排列,确保每个数字在不同位置被尝试。

生成所有运算符组合 三个运算符(连接两个数字)可以是+-*/,共4^3=64种可能组合。

考虑运算优先级和括号 通过不同的运算顺序(即括号位置)来改变优先级,共有以下5种表达式结构:

  1. ((a op b) op c) op d
  2. (a op (b op c)) op d
  3. (a op b) op (c op d)
  4. a op ((b op c) op d)
  5. a op (b op (c op d))

JavaScript代码实现

function solve24(nums) {
  const ops = ['+', '-', '*', '/'];
  const solutions = [];

  function evaluate(a, b, op) {
    switch (op) {
      case '+': return a + b;
      case '-': return a - b;
      case '*': return a * b;
      case '/': return a / b;
    }
  }

  function calculate(permutation, opsCombination) {
    const [a, b, c, d] = permutation;
    const [op1, op2, op3] = opsCombination;

    // 尝试5种不同的括号组合
    const expressions = [
      `((${a} ${op1} ${b}) ${op2} ${c}) ${op3} ${d}`,
      `(${a} ${op1} (${b} ${op2} ${c})) ${op3} ${d}`,
      `(${a} ${op1} ${b}) ${op2} (${c} ${op3} ${d})`,
      `${a} ${op1} ((${b} ${op2} ${c}) ${op3} ${d})`,
      `${a} ${op1} (${b} ${op2} (${c} ${op3} ${d}))`
    ];

    for (const expr of expressions) {
      try {
        const result = eval(expr);
        if (Math.abs(result - 24) < 1e-6) {
          solutions.push(expr);
        }
      } catch (e) {
        // 忽略除以零等错误
      }
    }
  }

  // 生成所有数字排列
  function permute(arr, start = 0) {
    if (start === arr.length - 1) {
      // 生成所有运算符组合
      for (const op1 of ops) {
        for (const op2 of ops) {
          for (const op3 of ops) {
            calculate([...arr], [op1, op2, op3]);
          }
        }
      }
      return;
    }

    for (let i = start; i < arr.length; i++) {
      [arr[start], arr[i]] = [arr[i], arr[start]];
      permute(arr, start + 1);
      [arr[start], arr[i]] = [arr[i], arr[start]];
    }
  }

  permute(nums);
  return solutions.length > 0 ? solutions : ['No solution found'];
}

// 示例用法
console.log(solve24([1, 5, 5, 5])); // 输出可能的解法

优化方向

避免重复计算 可以缓存已计算过的数字和运算符组合,减少重复计算。

提前终止 当找到第一个解时立即返回,而不是计算所有可能性。

浮点数精度处理 使用Math.abs(result - 24) < 1e-6而非result === 24来避免浮点数精度问题。

避免eval 可以构建表达式树或使用其他方式计算表达式值,避免使用eval带来的安全风险。

示例输出

对于输入[1, 5, 5, 5],可能的输出包括:

js实现24点算法

["(5 - (1 / 5)) * 5"]

这个实现通过穷举所有可能的数字排列、运算符组合和括号位置来寻找解法,虽然效率不高但对于4个数字的情况已经足够。

标签: 算法js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…