如何評價逆波蘭表示式 RPN 計算器

時間 2021-12-23 15:00:04

1樓:山雀教主周半仙

有重要的收藏價值。

首先先向非電腦科學專業的讀者科普一下字尾表示式(逆波蘭表示式,RPN)是什麼,以及RPN和計算的關係:

字尾表示式,顧名思義,就是將運算子放在運算元後面的表示式。比如我們正常的表示式1+2,用RPN表達則是:1 2 +,加號作為運算符號成為了表示式的字尾。

而RPN和計算有什麼關係呢?廣義上的計算機——也包括計算器——讀取算式的方式是一次讀乙個數或乙個算式。如果計算機直接讀取乙個中綴表示式,比如2×3+4÷5,那麼它的計算過程是這樣的:

計算器讀完2×3後得到得數6。

計算器讀入相對優先順序低的+。

再讀到乙個4,加起來等於10。

計算器讀到了乙個優先順序高的除號——這意味著剛剛的+計算第二個運算元並不是4,而是4除上什麼東西。這樣它就只能拋掉剛剛的得數,載入上乙個得數6。

計算器讀入5,知道第二個運算元是4÷5,將其和6相加得到6.8。

計算器讀到結束符,輸出答案6.8。

但如果把2×3+4÷5轉換為RPN:2 3 × 4 5 ÷ +,那麼計算器的計算過程就是這樣的:

計算器讀入兩個運算元2和3。

計算器讀到×,這意味著把這兩個運算元乘到一起,得到乙個新的得數6,作為運算元1。

計算器再讀到4和5作為運算元2和運算元3。

讀到÷,÷有兩個運算數,因此將後來的運算元2和運算元3取出作除法,得到得數0.8新的運算元2。

讀到+,將運算元1和運算元2相加,得到最終結果。

計算器讀到結束符,輸出答案6.8。

可以看到,RPN節省了因為優先順序帶來的重複計算的成本,且使得算式的處理過程更為簡單。因此,計算機處理算式一般是先轉換為字尾表示式再處理的。

然後就是RPN計算器。這類計算器可以看到大多數都是早期研發的產品(至多到00年代)(對,就是那些惠普早期的產物),因為那一代計算器受到硬體效能的限制,無法自動完成將中綴表示式轉換為字尾表示式的演算法,只好讓使用者自己把算式轉換為字尾表示式。在當時看來這是一種由科技限制帶來的無奈之舉,但從科技發展的角度來看,在現在惠普旗艦機型HP Prime都支援直接按與自然書寫一致的方式輸入式子的情況下,這類計算器顯然已經落伍了。

儘管如此,作為計算器發展歷史的一環,這類計算器仍然有不小的收藏價值。

在lambda表示式中如何使用遞迴

包遵信 這就是大名鼎鼎的 Y Combinator 啊,匿名遞迴是可以實現的。比如要求 n 的階乘,怎麼辦呢?先看階乘的遞迴定義 f n n 0 1 n f n 1 這個定義右側也用到了 f,所以看起來得給 f 起個名字。其實有辦法繞過 先定義這麼乙個 高階 函式 F f lambda n n 0 ...

如何評價 GCC 的 C 11 正規表示式?

胡軒 別的版本我不知道,但是GCC4.8著實坑爹。麼得編譯警告 錯誤,直接return false 像極了9月10日開源的HarmonyOS 2.0裡面的mem.c,不過這個是在drivers目錄下,不是很重要。 王曉亮 g 4.9確實支援了std regex,但是發現icase不好使,在網上看到乙...

你是如何學會正規表示式的?

一絲混亂 大部分知識和技能的都符合二八定律 20 知識點的使用頻率是80 80 知識點的使用頻率是20 但是這些東西的教程或者說明是一股腦兒全部給你的,並沒有著重標出哪些是重點,哪些用的頻率不那麼高。正則就是乙個非常典型的例子,我覺得正則說是9.5 0.5都不為過。我使用過程中,用到最多的是i g ...