什么Python代码为二元运算符生成所有可能的分组(树)

2024-03-07

正如几个 SO 问题中所解释的,更抽象的是数学世界 http://mathworld.wolfram.com/BinaryBracketing.html,加泰罗尼亚数字的序列恰好对应于可以为任何给定数量的运算符生成的括号分组的数量。但我还没有找到一种算法来生成所有这些分组。

该二元包围算法对应于酱油格子 http://en.wikipedia.org/wiki/Tamari_lattice并且可以用多种不同的方式来描述。该算法最明显的实际用途是通过二元运算符及其所操作的数字的每个可能的括号来生成所有可能的表达式。这可用于详尽地测试二叉树上的各种类型的操作。

网络搜索确实揭示了C# 中的一种实现 http://blogs.msdn.com/b/ericlippert/archive/2010/04/19/every-binary-tree-there-is.aspx但我认为我需要一段时间才能理解,因为我不知道 C# 语法。

那么,什么 python 代码生成围绕运算符的所有可能的括号分组(因此可以与实际表达式一起使用来生成所有可能性)?对于 2、3 和 4,输出如下:

所有二叉树(2)

  1. (x(xx))
  2. ((xx)x)

所有二叉树(3)

  1. (((xx)x)x)
  2. ((x(xx))x)
  3. ((xx)(xx))
  4. (x((xx)x))
  5. (x(x(xx)))

所有二叉树(4)

  1. (x(x(x(xx))))
  2. (x(x((xx)x)))
  3. (x((xx)(xx)))
  4. (x((x(xx))x))
  5. (x(((xx)x)x))
  6. ((xx)(x(xx)))
  7. ((xx)((xx)x))
  8. ((x(xx))(xx))
  9. (((xx)x)(xx))
  10. ((x(x(xx)))x)
  11. ((x((xx)x))x)
  12. (((xx)(xx))x)
  13. (((x(xx))x)x)
  14. ((((xx)x)x)x)

更好的是执行如下操作的代码:

所有二叉树("2+3/4")

output:

  1. 2+(3/4)
  2. (2+3)/4

怎么样

def allbinarytrees(s):
    if len(s) == 1:
        yield s
    else:
        for i in range(1, len(s), 2):
            for l in allbinarytrees(s[:i]):
                for r in allbinarytrees(s[i+1:]):
                    yield '({}{}{})'.format(l, s[i], r)

使用示例:

for t in allbinarytrees('1+2-3*4/5'):
    print(t)

Output:

(1+(2-(3*(4/5))))
(1+(2-((3*4)/5)))
(1+((2-3)*(4/5)))
(1+((2-(3*4))/5))
(1+(((2-3)*4)/5))
((1+2)-(3*(4/5)))
((1+2)-((3*4)/5))
((1+(2-3))*(4/5))
(((1+2)-3)*(4/5))
((1+(2-(3*4)))/5)
((1+((2-3)*4))/5)
(((1+2)-(3*4))/5)
(((1+(2-3))*4)/5)
((((1+2)-3)*4)/5)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么Python代码为二元运算符生成所有可能的分组(树) 的相关文章

随机推荐

  • 如何有条件地导入 ES6 模块?

    我需要做类似的事情 if condition import something from something if something something doStuff 上面的代码无法编译 它抛出SyntaxError import an
  • 动态输入值不会使用 codeigniter 保存在数据库中

    I want letting user add dynamic inputs and save those values in the database But with this code only one value save to t
  • 通过字符串生成 EF orderby 表达式[重复]

    这个问题在这里已经有答案了 我想通过字符串参数生成表达式 一些代码如下 private Expression
  • Graphviz - 如何使标签中的文本左对齐?

    我正在使用 graphviz 来可视化我正在解析的语言的 AST 我想包含源代码 作为标签 但 graphviz 对齐标签内的文本 这会扰乱我的缩进 并且代码对缩进敏感 这是问题的示例 第二行代码不应缩进 这是生成的 dot 文件的相关部分
  • 嵌套数组和 ConvertTo-Json

    要使用 REST API 我必须传递一个如下所示的 JSON 对象 series metric custom powershell gauge points 1434684739 1000 注意这里的嵌套数组 我无法重现这个 这是我的代码
  • decltype(auto) 和 decltype(returning expr) 作为返回类型有什么区别?

    有什么区别decltype auto and decltype returning expression 作为函数 模板 的返回类型如果expr在这两种情况下都没有使用括号吗 auto f gt decltype auto return e
  • 功能级别的任何黄瓜 Before 和 After 挂钩

    我已经经历过很多帮助 但都是关于场景级别的解释 Cucumber JVM 是否有功能级别的 Before 和 After 挂钩 这一页黄瓜钩 https stackoverflow com questions 23113370 is the
  • Symfony 2 - 在 Amazon S3 上上传图像的最佳实践

    我有一个表格 其中有一个file字段上传图像 我需要将此图像上传到 Amazon S3 一步一步构建这个 我开始将图像上传到本地磁盘上 现在它可以工作了 上传发生在我的实体内部Page因为建议在保存实体之前测试上传是否成功 我最终得到了这段
  • Firebase 检索嵌套数据

    我在尝试从 Firebase 检索时遇到了一些麻烦 基本上我的组表是这样的 在这种情况下 根据group ID KpFibCHjJ1xpfLd07WJ 有一个account ID KpFiX2L7ENt6EBgrB0S 右边将会有多个帐户
  • 上传后使用 ExpressJS 将文件存储在 Mongo 的 GridFS 中

    我已经开始使用expressJS 构建REST api 我是节点新手 所以请耐心等待 我希望能够让用户使用 upload 路由的帖子将文件直接上传到 Mongo 的 GridFS 根据我在expressJS文档中的理解 req files
  • 如何使用 JPA 2.1 转换连接的元素集合?

    我有3张桌子user user team and team user id number name varchar team name varchar user team user id number FK gt user id team
  • Mercurial Eclipse 错误

    我正在尝试在 Eclipse 中使用 Mercurial 我为此下载了 Mercurial Eclipse 插件 但是 尽管我重新安装了很多次 但还是出现同样的错误 我将屏幕截图放在下面 Checking encoding cp1254 C
  • 检查 rsync 命令是否运行成功

    以下 bash 脚本每小时执行一次文件夹的 rsync bin bash rsync r z c home pi queue email protected cdn cgi l email protection home foobar rm
  • Urllib2 中的代理身份验证错误 (Python 2.7)

    Windows 7 64 位 Python 2 7 如果我尝试使用 Urllib2 我会收到此错误 Traceback most recent call last File C Users cYanide Documents Python
  • 如何获取 Mac 版 zipalign?

    我已经有一个未签名版本的 apk 我正在尝试在我的 Mac 上对其进行签名 在最后一步 它建议对签名的 apk 进行 zipalign 但 mac 没有 zipalign 我做了 酿造搜索 仍然找不到它 我在网上搜索 找不到独立的 zipa
  • 在 git 中,有没有办法在不应用存储的情况下显示未跟踪的存储文件?

    如果我跑git stash u 我可以隐藏未跟踪的文件 但是 据说未跟踪的文件根本不会显示git stash show stash 0 有没有办法在不应用隐藏的情况下显示未跟踪的隐藏文件 未跟踪的文件存储在存储提交的第三个父级中 这实际上没
  • 将 Windows 容器(使用 Docker 创建)部署到 Azure 容器服务中

    我正在尝试完成一项关于如何在 Azure 域 环境中正确使用 Windows 容器的体系结构研究 在该域 环境中我必须容器化 Dot Net Core Web API 应用程序并将该容器部署到 Azure 容器服务中 这是我所做的事情 我确
  • Python 为消息添加自定义反应

    我想为多个命令添加多个自定义反应 或者如果我们添加反应列表 它将从该列表中添加随机反应 那么该怎么做呢 from discord utils import get 按名称添加表情符号 reactions emoji name 1 emoji
  • 如何消除视频中剧烈的亮度变化?

    我有从摄像机获得的图像流 我发现有时来自流的图像的亮度会出现很大的峰值 每个像素的值都会跳跃或下降 然后在下一个图像中返回到正常的亮度级别 这对我的算法来说是一个大问题 有什么办法可以防止这种亮度峰值吗 我正在考虑在每个像素上使用低通滤波器
  • 什么Python代码为二元运算符生成所有可能的分组(树)

    正如几个 SO 问题中所解释的 更抽象的是数学世界 http mathworld wolfram com BinaryBracketing html 加泰罗尼亚数字的序列恰好对应于可以为任何给定数量的运算符生成的括号分组的数量 但我还没有找