使用树生成随机数学方程 - 避免括号

时间:2014-07-17 02:12:00

标签: math tree swift equation parentheses

编辑:这最初是在programmers.stackexchange.com上,但由于我已经有了一些代码,我认为这可能会更好。

我正在尝试生成随机数学问题/方程式。在研究了我发现的最好(也是唯一)的事情之后,这个问题是:Generating random math expression。因为我需要所有4个操作,并且我将使用它的应用程序是针对孩子的,我希望能够确保所有数字都是积极的,分区会出来等等,我决定使用一棵树

我有树工作,它可以生成一个方程式,并将其评估为一个数字。问题是我无法在需要时使用括号。我尝试了几种解决方案,主要涉及:

  • 查看此节点是否位于父节点的右侧
  • 查看节点是否更重要/更重要,然后是父节点(*> +等)。
  • 查看节点&它的父类型相同,如果是,那么该订单对该操作很重要。

不重要,我使用的是Swift,这就是我到目前为止所做的:

func generateString(parent_node:TreeNode) -> String {
    if(self.is_num){
        return self.equation!
    }

    var equation = self.equation!
    var left_equation  : String = self.left_node!.generateString(self)
    var right_equation : String = self.right_node!.generateString(self)

    // Conditions for ()s

    var needs_parentheses = false

    needs_parentheses = parent_node.importance > self.importance
    needs_parentheses = (
                            needs_parentheses
                            ||
                            (
                                parent_node.right_node?.isEqualToNode(self)
                                &&
                                parent_node.importance <= self.importance
                                &&
                                (
                                    parent_node.type != self.type
                                    &&
                                    ( parent_node.order_matters != true || self.order_matters != true )
                                )
                            )
                        )
    needs_parentheses = (
                            needs_parentheses
                            &&
                            (
                                !(
                                    self.importance > parent_node.importance
                                 )
                            )
                        )

    if (needs_parentheses) {
        equation = "(\(equation))"
    }
    return equation.stringByReplacingOccurrencesOfString("a", withString: left_equation).stringByReplacingOccurrencesOfString("b", withString: right_equation)
}

我无法让它发挥作用,而且一直在撞墙挡住我的头。

关于删除括号的主题我唯一能找到的是:How to get rid of unnecessary parentheses in mathematical expression,我无法弄清楚如何将它应用于我的用例。另外,我找到了this,我可能会尝试构建一个解析器(使用PEGKit),但我想知道是否有人有好主意确定括号需要去哪里,或者放置它们在任何地方,删除无用的。

编辑:为了清楚起见,我不需要有人为我写这篇文章,我只是在寻找它需要做的事情。

编辑2:由于这个应用程序将针对孩子,我想尽可能使用尽可能少的括号,同时仍然有正确的方程式。此外,上述算法没有放置足够的括号。

1 个答案:

答案 0 :(得分:0)

我已经编写了一个不使用树的python 3 pgrm,但是确实使用整数解成功生成了有效的方程式,并且使用了所有四个运算以及括号表达式。我的目标受众是练习作业顺序(PEMDAS)的五年级学生。

872  = 26 * 20 + (3 + 8) * 16 * 2      
251  = 256 - 3 - 6 + 8 / 2         
367  = 38 * 2 + (20 + 15) + 16 ** 2         
260  = 28 * 10 - 18 - 4 / 2         
5000 = 40 * 20 / 4 * 5 ** 2         
211  = 192 - 10 / 2 / 1 + 24         
1519 = 92 * 16 + 6 + 25 + 16   

如果您对python感兴趣,我正在将python转换为JavaScript,并为学生和教师提供一个网页。