2011-04-13

30÷2(2+3)÷5=?

這是個語意解讀上的問題(1s)

啊講詳細點就是人和電腦對係數的處理方式不太統一。
而且人類在計算時,下意識進行的大量省去和結合等等都是電腦不懂得,電腦的優點只在於學會了之後很快而已(噴笑)


國小老師教我們
step1. 2+3 replace 5 括號優先
step2. 2(5) replace 10 係數優先
step3. 30÷10 replace 3 左結合
step4. 3÷5 replace 0.6 為最終解

如果電腦要達到這種解讀的話
必須在處理係數的時候,是用刮號以及乘號去取代:2(2+3) replace (2*(2+3))

另一個可能出現的解答15的原因在於係數只用乘法取代,原式變成30÷2*5÷5。

step1. 2 replace 2*
step2. (2+3) replace 5
step3. 30÷2 replace 15
step4. 15*5 replace 75
step5. 75÷5 replace 15

不過這很明顯不是使用者期望的....不過這邊,如朋友所言,這裡已經不是 syntax 的問題而是 semantics的問題啦XDDD


括號跟分數的簡化最好是每做完一步都check一下,這個check是自然演算法中的[下意識],但是電腦很笨(真正厲害的是工程師─請支持正版),所以你不寫一串不太直覺的處理沒辦法達到自然運算的效果。



至於/跟÷這兩個傢伙,在自然語言中的語意更是天差地遠。
A/B 解讀為分數,是用橫式表示直式的寫法。(...很令人頭暈齁...沒關係稱下去你就得到它了!!!)
A÷B 解讀為A除以B

雖然現在看起來一樣,但是丟到更長的式子裡去就很可怕了。

以下的ABCD為代數

手寫的 A/BC/D,是先解讀/號並自動加上刮號,是表示((A÷B)*(C÷D)),答案寫成AC/BD

但是(在某種不可能發生在人類自然解讀的情形下)
電腦對於A/BC/D解讀順序是先把B視為C的係數,(A/(B*C))/D,答案是A/BCD。

我compiler修得亂七八糟的,那些專有名詞都忘記系蝦毀惹。

沒有留言:

張貼留言

Check for typo before sending