CocoaChina 11-08
Python-所有组合,包括方括号
index_new4.html
../../../zaker_core/zaker_tpl_static/wap/tpl_keji1.html

 

For u unknown variables ( e.g. a,b,c,d ) and the symbols +-*/, find all possible equations of length n

An example being ( for u=2, n=5 ) :

( a+b ) /a

我当前的代码可以创建所有可能方程式的列表 , 但不带方括号

v = [ "a", "b" ] #Variabless = [ "+", "-", "*", "-" ] #Symbolsn = 7 #Amount of variables and symbolsa = [ ] #Lists combined ( find possible equations from ) for i in range ( n ) : if i % 2 == 0: a.append ( v ) else: a.append ( s ) equations = list ( itertools.product ( *a ) ) for each in equations: print ( "".join ( each ) )

总之 , 我编写的代码并不包含方程式的所有可能 .

例如 , 对于 n = 5 和 2 个变量 , 我的代码找不到 ( a b ) * b 的可能性

在 n = 7 和 4 个变量的情况下 , 它找不到 ` ( a b ) * ( c d )

我的主要问题:如何创建一些代码 , 将每个可能的方程式包含在其中 , 并找到所有可能的方括号 , 而不重复

复制示例: ( a b ) * c 和 a * ( b c )

注意:这是重复的 , 因为由于正在测试所有可能的方程 , 所以在某些时候 a b 变为 b c, 因此 * c 变为 * a

这个函数可以工作 , 但是它确实有很多表达式可以实现相同的功能 , 例如 x-x 或 x / x, 但有很多不同的东西代替 x. 但是 , 它避免了由于关联性或可交换性造成的琐碎重复 .

同样 , 所有可能表达式的列表很快就会变得很长 . 例如 , 如果有 4 个变量 , 而所有带有 5 个项的表达式 , 则可以获得 7845320. 生成器的使用将使您不会耗尽内存 , 但不会因此而耗费非常长的时间 .

def all_expressions ( size, variables ) : def _all_expressions ( _size ) : if _size == 1: for variable in variables: yield ( variable, '' ) else: for subsize in range ( 1, _size//2 + 1 ) : for expr1, type1 in _all_expressions ( subsize ) : for expr2, type2 in _all_expressions ( _size - subsize ) : if subsize < _size - subsize or expr1 <= expr2: if type1 == '+': if type2 != '+': yield ( " ( {} + {} ) ".format ( expr2, expr1 ) , '+' ) else: yield ( " ( {} + {} ) ".format ( expr1, expr2 ) , '+' ) if type1 == '*': if type2 != '*': yield ( " ( {} * {} ) ".format ( expr2, expr1 ) , '*' ) else: yield ( " ( {} * {} ) ".format ( expr1, expr2 ) , '*' ) if type1 != '*': yield ( " ( {} / {} ) ".format ( expr1, expr2 ) , '/' ) if type1 != '+': yield ( " ( {} - {} ) ".format ( expr1, expr2 ) , '-' ) if subsize < _size - subsize: if type2 != '*': yield ( " ( {} / {} ) ".format ( expr2, expr1 ) , '/' ) if type2 != '+': yield ( " ( {} - {} ) ".format ( expr2, expr1 ) , '-' ) for expr, t in _all_expressions ( size ) : yield exprfor expr in all_expressions ( 3, [ 'a', 'b', 'c' ] ) : print ( expr )

相关文章
评论
没有更多评论了
取消

登录后才可以发布评论哦

12 我来说两句…
打开 ZAKER 参与讨论