当前位置:首页 > JavaScript

js实现24点算法

2026-04-04 22:36:29JavaScript

24点算法实现思路

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

基本算法步骤

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

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

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

js实现24点算法

  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])); // 输出可能的解法

优化方向

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

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

js实现24点算法

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

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

示例输出

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

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

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

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

相关文章

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…