對「神奇24」遊戲的一些思考

2021-03-31 10:45:30 字數 1693 閱讀 3104

「神奇24」遊戲指的是,給出4個數abcd和+-*/(),求解一種運算方法使得,算式的結果為24。小時候曾經玩過這樣的遊戲,是在電腦上面的,現在想想看要實現起來也不難。

最先想到的當然就是利用計算機的強大的計算算能力,去窮舉每乙個可能的表示式,判斷其結果是不是24,將結果為24的表示式直接輸出就可以了。其中就關係到表示式的生成和求解。

表示式的求解方法,在資料結構裡面講了一種求解表示式的方法,字尾表示式的棧求解法。對於這個問題採用字尾表示式是最方便的,其優勢在後面將會看到。字尾表示式的求解很簡單:

字尾表示的算式是由左向右被掃瞄,對算式的每個元素施加如下的法則:

1.若元素是乙個變數或運算元,把它壓入堆疊;

2.若元素是乙個操作符,則彈出堆疊頂部兩個元素,完成操作,並將結果壓入堆疊;

2.整個表示式被掃瞄以後,表示式結果就儲存在堆疊頂上。

中綴表示式變字尾表示式的辦法:

這個演算法歸功於dijkstra。從左到右掃瞄中綴表示式,隨著掃瞄的進行,字尾表示式生成並輸出,步驟如下:

1.檢查輸入的下乙個元素。

2.若它是乙個運算元,則輸出它。

3.若它是乙個開括號(左括號),把它壓入堆疊。

4.若它是乙個操作符,則

若棧頂是乙個開括號,把操作符壓入堆疊。

若它有比棧頂操作符更高的優先權(乘和除優先於加和減),則把此操作符壓入堆疊,否則從堆疊探出操作符到輸出,並重複步驟4。

5.若它是乙個閉括號(右括號),則彈出操作符到輸出,直到遇上乙個開括號,彈出作廢此開括號。

6.若還有輸入,回到步驟1。

7.若沒有輸入,則彈出所有剩餘操作符到輸出。

為什麼使用字尾表示式?這就要看看表示式的生成辦法,如果用中綴表示式,難得就是表示式的生成,因為涉及到對括號的處理,仔細想想,就會知道其難度有多大。用字尾表示式則不需要處理括號的問題,而且借助字尾表示式,我們還可以分析所有的可能的表示式到底有多少個,並且都是什麼形式,現分析如下:

對於a b c d四個數,每乙個數的位置首先是固定的,這是遊戲規則要求的,這個就為我們的求解大大減低了難度,想想如果數的位置不固定,搜尋的表示式的數目將是現在的4的階乘倍。由中綴變到字尾,可以知道,其運算元的次序也是不變的,這一點從中綴表示式變字尾表示式的規則可以保證。另外重要的一點是,總可以保證在乙個合法的字尾表示式中,任何乙個操作符,其前面的操作符的個數(要包括此操作符),與其前面的運算元的個數總是有如下的關係:操作符個數《運算元個數。這一點至關重要,舉幾個例子:

合法的字尾式:abcd-*+

非法的字尾式:a+bcd-- (+前面有乙個運算元1<1不成立)

現在在看看如何構造這些合理的表示式吧,顯然合理的形式只可能有如下的形式:

1. ab*c*d*

2. ab*cd**

3. abc*d**

4. abc**d*

5. abcd***

其中*代表加減乘除中的任意乙個運算子,對於每一種形式就有4*4*4=64個表示式,總共有5種形式,則所有的表示式個數有64*5=320個,也就是說總共只用320個式子。

這樣,我們就找到了所有的可能的式子的構造辦法,構造完所有的式子後,再用字尾表示式的求解辦法,求解每乙個式子並判斷是否等於24。

剩下來要做的就是如何將字尾表示式變為中綴形式並輸出了,這個並不難,參考字尾表示式的求解方法,就可以知道了,就是在遇到運算子的時候不求值,而直接生成乙個字串,壓回堆疊即可。

具體的實現現在還沒有寫出來,今天只能空口說說我想象中的實現辦法,大家也不要笑話。

對Python shell的一些思考

對python shell的一些思考 就兩次指令碼處理的編碼練習而言,我感覺如果使用python去寫指令碼來處理日常事務的話,相對於shell是一件比較麻煩的事情,因為我可以使用shell在花費更少的時間內,比較熟練地使用awk sed和grep這些常用的命令在非常簡短的指令碼語句內,完成pytho...

對迷茫的一些思考

最近依然迷茫不安,從3月份開始嘗試去找工作,現在已經4月底,依然沒有著落。不是沒有好機會,而是自己能力不足,抓不住機會,於是自己很慌亂,發現不會或不擅長的東西,拼命在補,同時也在後悔為什麼當初沒有好好努力。然後也明白了一些道理。人們總說學習永遠不晚,其實是會晚的,會錯過很多時機,但時機是不會再次到來...

對程式設計的一些思考

1.程式 是程式設計思想的體現 我想程式設計人員在設計程式之初,肯定會有一番思考。思考主要是程式設計的目的,然後是實現目的的方法,最後才是 的實現。所以,程式 是程式設計思想的體現。分析 的啟示 我們分析程式 時,可以在看 之前,想想這個 要幹什麼事,然後再去看 就容易多了。程式設計的啟示 先思考程...