当前位置:首页 > JavaScript

js实现24点算法

2026-01-31 06:35:32JavaScript

js实现24点算法

js实现24点算法

24点算法简介

24点游戏的目标是通过加、减、乘、除四则运算,将4个数字组合成结果为24的表达式。以下是基于JavaScript的实现方法。

基本思路

  1. 排列组合:生成所有可能的数字排列顺序。
  2. 运算符组合:尝试所有可能的运算符组合(+、-、*、/)。
  3. 括号优先级:考虑不同括号组合对运算顺序的影响。
  4. 验证结果:检查当前组合是否能得到24。

实现代码

function solve24(numStr) {
  const nums = numStr.split('').map(Number);
  const operators = ['+', '-', '*', '/'];
  const solutions = [];

  // 生成所有数字排列
  function permute(arr, temp = []) {
    if (arr.length === 0) {
      evaluate(temp);
      return;
    }
    for (let i = 0; i < arr.length; i++) {
      const newArr = [...arr];
      newArr.splice(i, 1);
      permute(newArr, [...temp, arr[i]]);
    }
  }

  // 尝试所有运算符和括号组合
  function evaluate(numbers) {
    for (let op1 of operators) {
      for (let op2 of operators) {
        for (let op3 of operators) {
          // 无括号:((a op1 b) op2 c) op3 d
          const expr1 = `((${numbers[0]}${op1}${numbers[1]})${op2}${numbers[2]})${op3}${numbers[3]}`;
          tryCalculate(expr1, numbers);

          // 括号组合:(a op1 (b op2 c)) op3 d
          const expr2 = `(${numbers[0]}${op1}(${numbers[1]}${op2}${numbers[2]}))${op3}${numbers[3]}`;
          tryCalculate(expr2, numbers);

          // 其他括号组合
          const expr3 = `${numbers[0]}${op1}(${numbers[1]}${op2}(${numbers[2]}${op3}${numbers[3]}))`;
          tryCalculate(expr3, numbers);
        }
      }
    }
  }

  // 计算表达式并验证结果
  function tryCalculate(expr, numbers) {
    try {
      const result = eval(expr);
      if (Math.abs(result - 24) < 1e-6) {
        solutions.push(expr.replace(/(\d+)/g, m => numbers[numbers.indexOf(Number(m))]));
      }
    } catch (e) {
      // 忽略除零等错误
    }
  }

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

// 示例用法
console.log(solve24('1234')); // 输出可能的解如:(1+3)*(2+4)

关键点说明

  1. 排列生成:通过递归生成4个数字的所有排列(共24种顺序)。
  2. 运算符遍历:对每种数字排列尝试所有运算符组合(共64种)。
  3. 括号处理:通过硬编码常见括号组合方式,覆盖主要运算优先级情况。
  4. 浮点数比较:使用Math.abs(result - 24) < 1e-6避免浮点数精度问题。

优化方向

  1. 去重:对数学等效的解进行去重(如a+b与b+a)。
  2. 性能优化:剪枝提前终止无效分支的运算。
  3. 扩展性:支持更多数字或目标值的计算。

该方法通过暴力搜索覆盖所有可能性,确保能找到所有可行解,但时间复杂度较高(O(n! * k^m),其中n=4, k=4, m=3)。

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

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现抽奖

js实现抽奖

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

使用js实现

使用js实现

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

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…