实现思路:参照原作者想法,由于设计到了表达式,很自然的想到了用二叉树来实现。简单概括为:先列出所有表达式的可能性,然后运用表达式树,也就是二叉树计算表达式的值,当然还需要使用递归来具体实现各个功能,下面我们具体来实现下吧。
表达式树的所有叶子节点均为操作数(operand), 其它节点为运算符(operator),本次采用二叉树来表示表达式中各个属性的值,这样也方便我们计算。
首先是遍历所有表达式的可能情况,这里得到得是操作数所有可能得情况,假如传入的l是序列[1,2,3,4],count1是4,count2是4,那么得到的结果就是12个随机且不重复的[1,2,3,4]序列
同理,产生运算符的不同排列结果
然后根据传入的表达式的值,构造表达式树,首先我们创建一个表示节点的类
然后树的形式无非两种,就是上面大家看到的两种形式,用程序表示出来就是两种函数,参数分别对应了运算符和运算符,还是比较好理解的,知识涉及一些二叉树的知识。
然后就是计算表达式树的值,这里也运用了递归。
输出所有可能的结果,这里注意print_node方法也是使用的递归来打印数据,并且使用 end='' 去掉了换行符。
最后在程序的入口调用calculate方法,并传入数据,也就是你得到的牌。
成果:
这个参考一下:是csdn的输入4个数字, 输出所有用加减乘除结果为24的表达式. 代码如下:
def isEqual(num1, num2):
return
abs(num1 - num2) <1e-5
# End of isEqual().
http://blog.csdn.net/jq0123/article/details/6092435
#get the left numbers这部分代码错误.
tempList[temp]=numList[k] 之后的 temp=1 应该是 temp = temp + 1.
并建议把 result1==24.0 改为 abs(result - 24) <1e-4, 这样允许分数计算:
Please input 4 numbers to computer 24:(use ',' to divide them)3,3,8,8
You input is : [3.0, 3.0, 8.0, 8.0]
8.000000 / 0.333333 = 24.000000
3.000000 - 2.666667 = 0.333333
8.000000 / 3.000000 = 2.666667
press anykey to exit