2016-05-31 67 views
0

爲了好玩,我正在玩一個解決24 game的程序,我試圖找到一種避免在檢查多個解決方案時顯示等效表達式的方法。檢測等效表達式的算法

例如,給定號碼6, 6, 6, 6,該算法可以(迭代地或遞歸地)生成若干等效表達式。
例如:((6 + 6) + 6) + 6(6 + 6) + (6 + 6)和其他,因爲它們都意味着「將四個六個加在一起」。

顯然,處理所有四個算術操作數時,事情變得更有趣。
例如,表達式A * B + C * DC * D + B * A也是等同的。

另一情況下,這可能是更難以檢測是A - B - C - D VS A - (C + B + D)

思想,我迄今爲止:

  1. 使用括號僅在需要時(通過跟蹤優先級和結合)。
  2. 訂購操作數以便於比較。
+0

你的意思是你的算法可能與中綴,後綴或波蘭符號同時工作? –

+0

不,我的意思是弄清楚兩個算術表達式是否相同,我不在乎它與它的工作原理 –

回答

1

生成了所有可能的結果爲24的表達式後,我會添加一個標準化步驟。這一步的目標是去除多餘的括號。

如何remove redundant parenthesis is given here的一個很好的解釋。之後,你只需要一組所有規範化的表達式。

+0

這是一個開始,但是您需要更多的規範化 - 例如,大概你想考慮'2 + 4 + 9 + 9'​​與'4 + 9 + 2 + 9'​​相同,依此類推。您可以通過爲所有操作數選擇關聯和交換操作符(如'+'和'*'(例如,最小的操作符))來執行此操作。 –

+1

@j_random_hacker是的,你是對的。謝謝,我忘記了這一點。是的,它可以通過對一組交換運算符中的操作數進行排序來解決。你也忘了減號。 '(a -b -c)'。減號可以像+:'a +(-b)+(-c)'和排序-b和-c一樣處理。 –