用 Haskell 进行组合数学时失败

主要观点:通过将算术表达式转换为后缀表达式来避免处理括号,以解决用 123456789 这 9 个数字通过四则运算得到 100 的问题,并介绍了生成后缀表达式的方法及相关代码实现,还利用组合数学计算表达式数量及估计运行时间。
关键信息

  • 给出用 123456789 得到 100 的挑战,Thomas 展示代码和推理后得出有 14 种可能答案。
  • 介绍后缀表达式的技巧及相关代码 eval 用于计算后缀表达式的值。
  • 定义 State 数据类型用于跟踪生成过程中的状态。
  • 分别实现 emit_digit 和 emit_operator 函数来确定可输出的数字和运算符。
  • 通过 combine emissions 函数将两者结合生成所有可能的表达式。
  • 利用组合数学公式计算 1 - 9 数字生成的表达式数量,并估计运行时间约为 16 - 17 分钟。
    重要细节
  • 在 Haskell 中通过不直接修改状态的方式处理函数中的状态变量。
  • 生成后缀表达式时需考虑数字和运算符的输出条件及状态跟踪。
  • 组合函数通过 foldMap 处理所有可能的排放并在 do 语法中同时尝试不同变体。
  • 利用组合数学公式考虑运算符的放置限制及计算表达式数量。
  • Haskell 代码中使用了一些辅助函数如 dig2chr 等,以及 forM_ 等用于过滤和打印满足条件的表达式。
阅读 15
0 条评论