编辑:这最初是在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:由于这个应用程序将针对孩子,我想尽可能使用尽可能少的括号,同时仍然有正确的方程式。此外,上述算法没有放置足够的括号。
答案 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,并为学生和教师提供一个网页。