字體:小 中 大 | |
|
|
2011/05/07 17:31:37瀏覽647|回應0|推薦3 | |
6÷2(1+2)這個式子最近成了熱門話題,連我這個數學不好的人也著了迷,參考過論壇很多人的看法,對這個問題有了近一步的認識與思考。論壇上很多人為了這個問題爭的臉紅脖子粗,甚至互指彼此不懂數學,要對方重修數學云云。我可理解這種反應,但其實是不必要的。大家先想想自己的缺失,若是要擊倒自己的論點,該怎麼破。由這個方向去想或許會得到意想不到的結論。我不敢說自己解開了這個問題,畢竟我真的不是專家,只能說提供一些思考方向而已。 事實上,看到這個式子,我最初的想法是:這是個不合法式子,無法接受。我們這種程式員的想法很死板,式子不對就無法編譯成功,更不要說有結果了。據說這是國小算術題,那麼依四則運算的法則,沒有說 2(1+2) 可以視為 2 * (1+2),所以這算是題目出錯:送分。 但是如果不把範圍縮得那麼小,這題目卻是合法的。因為我們人類很懶,應該寫 X * Y 的,後來變成 X ‧ Y ,再後來變成 XY ,這就變成了我們爭議的根源了。 另外一個爭議的根源是除法。自國小以後,我們就沒有再接觸過 ÷ 的符號了。而用一橫線來表示除法,而大家可能沒想過,這一橫線不僅有除法的意義,事實上它也給了我們空間上的意義。上面是分子,下面是分母,這種分隔方式已在我們腦海裡形成一個強烈的識別模式。 所以你看到 6/2X ,你會如何去解釋它?大概大部份的人會把它解釋成 6 / (2X) ,而不是 6 / 2 * X 。 那你看到 6÷2X 呢?大部份的人可能還是會把它解釋成 6 / (2X) ,而不是 6 / 2 * X 。 那我們要如何表示 6 / 2 * X 呢?一些人會告訴你規定一定要寫成 6 / 2 * X 。但事實上,你翻開數學書,大概也找不到這個規定。因為我們用可以表示空間的橫線可以說明我們想要表達的意思。 6 / 2 * X 在數學書(這裡說的不是小學課本而已,小學的6÷2*X出了小學範圍,你可能也很少看到)裡你看到了是這樣: 6 我們可以看到乘法依然是省略的,但是它的空間配置絕不會讓你有所誤解。就算我把這個式子儘量弄在一行,但寫法及印刷方式一定會讓你看出來他們的關係。但在電腦裡就不一樣了,即便我 6/2 與 X 隔開來,變成 6/2 X,你可能還是意會不出這是 6 / 2 * X ,而沒有一本數學書規定你在這種失去空間意義的環境裡,式子要怎麼表示才是正確的,因為他們沒考慮到你要在電腦裡打這個式子。更糟的是 / 這個符號會匹配到我們腦中既定的空間區隔性,所以你常常會把它當成那一道橫線。所以甚至有些人會把 ÷ 和 / 視為不同(看到這種講法,我在心裡的OS是:大哥~你怎麼不看看你鍵盤上的計算機數字鍵區之後再說話呢?),把 6÷2*3 視為正常的四則運算,另外把 6/2*3 看成: 6 寫到這裡你大概知道問題在那裡了吧! 另外,這裡要說一個比較玄的觀念,可能有一些人無法接受:很多人以為「左而右算,先乘除,後加減」是數學定理,其實不是。你要「左而右算,先加減,後乘除」也可以,但是你式子表示的意思會跟你現在所學的不一樣。比如:ax+by,會變成先做 x+b ,然後再做 a * (x+b) * y 。為何說它們不是數學定理,因為它們不影響結果,在「先加減,後乘除」的世界裡,你要把 ax+by 表示成原來的「先乘除,後加減」的意思,只要寫成 (ax)+(by) 即可。在「先加減,後乘除」的世界裡數學原理一樣能運作,只是你看到的表達式會不一樣。 這種式子裡隱含的運算程序性,對我們程式設計師而言熟悉的很,我們常常在處理這種程序性的問題。用一般術語來說,這是運算子的優先順序問題。在C語言裡, ++ 運算優先順序比 + 的優先次序高, + 又比 = 的次序高,所以在下列的式子裡,會先執行 b++,再執行 a + b,再執行 = (指派)。 a = a + b++ ; 若是規定 + 運算優先順序比 ++ 的優先次序高,執行結果會不一樣。若我們把後面所說的這種優先順序定好了,所有的程式都按照同樣的法則運算,不會因為你 b++ 靠的近點就先執行,而一定還是會先執行 a + b 。 這樣子我們在解讀程式才會有一致性(不論是電腦編譯器或人肉解譯器),不會有太多的奇奇怪怪的例外要另外處理。 在人類世界,數學表示式雖沒ISO標準,但約定俗成「左而右算,先乘除,後加減」規則,也是一體適用的。不管你是純數或代數,沒有例外。為什麼有人有 6÷2X 那種 2X 要視為同一項先計算的錯覺。是因為我們在數學課裡,從沒有看過這種項式表示法。 要不是這樣的: 6 要不就是: 清清楚楚的,項式分明。 在乘法與加法中,因為它們符合交換律及結合律,所以運算程序性影響程度較小(這裡只是說在同是乘法或加法的情況下,如:2+2+2或2*2*2)。但除法與減法不一樣,必須特別強調其結合的順序,也就是我們說的「左而右算」。若是加減乘除混在一起,更是不能亂來。 例如: 6 - 2 - 3 = (6-2) - 3 = 4 - 3 = 1 你如果算成下面這樣就糗大了。 6 - 2 - 3 = 6 - (2-3) = 6 - (-1) = 6 + 1 = 7 除法也是一樣,但是配合上我們上面講的橫線匹配的問題會有比較有趣的現象,若你看到以下的式子,不去想「左而右算」,第一直覺是什麼: (3+3)/(1+1)(1+2) 因為有這樣的結合順序性關係,你反推回來若破壞了原來運算結合順序性的話,將會使內容改變,如下式可以這樣推嗎? 36÷12 => 36÷3*4 我曾看到論壇上有人想用類似的式子來證明 6÷2(1+2) = 1 是對的,因為上個式子不能這樣推,應該是這樣才合理: 36÷12 => 36÷(3*4) 所以 6÷2(1+2) 應該先算 2(1+2) 才合理。 其實他的邏輯有點奇怪,好像有一點白馬非馬之類的詭論,但是我邏輯不好,不太能夠用學術的說法去指出其邏輯層面的錯誤。但是我知道一點,他算法不成立是基於「左而右算」的理由上,若他堅持所謂的項式先算的理論才正確,那麼 36÷12 = 36÷3*4 是可以成立的。 因為在所謂的項式先算理論裡: 36÷3*4 = 36÷3(4) = 36÷12 套用的更明白一點: 36÷3X = 36÷12 其中 X = 4 但問題是 36÷3*4 可以這樣算嗎?這麼一道式子,可以套用「左而右算」又可以套用 「項式先算」嗎?那我們的數學系統會徹底混亂。用在某些時候要套用某種規則,在某些時候又要套用某種規則來說明數學,只會把事情複雜化而已。若是要把這種定義不清的語義實作到編譯器或解譯器裡,其語義樹會很複雜,甚至是難以實現。 我們平常數學課本及習作不用這種表示法,平時不會造成太大的困擾,但不巧的是我們現在是資訊時代,在電腦行式的輸入會使用到這樣的式子,這種語法模糊的嚴重性就會特別地突顯出來: 所以在維基的Order of operations詞條裡有一段話是這樣說的: Similarly, care must be exercised when using the slash ('/') symbol. The string of characters "1/2x" is interpreted by the above conventions as (1/2)x. The contrary interpretation should be written explicitly as 1/(2x). 事實上這樣的設計是有道理的,這是為了維持解讀數學式子的一致性(不論是電腦編譯器或人肉解譯器)。但是這樣畢竟會引起一些混淆,所以他接著這樣說: Again, the use of brackets will clarify the meaning and should be used if there is any chance of misinterpretation. 即使在C語言如此嚴謹的程式語言裡,我們也常被要求要加括號以避免誤解。至於我,即便是以下的式子也會特別加括號。 y = (2 * a) + 1 ; 因為我知道人類視覺的直覺性,遠快於理智的反應。 在論壇的討論裡,我說:最好贊成且堅持6÷2(1+2)答案為1的人,最好不是寫我們核電廠的控制程式的人,因為像 mathlab 等軟體都是9派的人。當然,這裡是開玩笑的,核電廠的程式都會驗證再驗證,就算他有什麼堅持,也不可能去硬拗執行出來的錯誤結果為對。但我為了這個問題曾搜尋到某個英文物理論壇裡,發現類似的問題也各有堅持,投票結果是一半一半。想一想這群物理的喜好者,有些可能是飛機控制程式的設計人員,有些可能是研究太空隕石軌道的專家等等,因為觀念的差異,再加上驗證的不足,還是有可能會造成一些嚴重的後果,誰知道呢? 這篇文章最重要的重點不在於答案是1還是9,而是呼籲數學界該站出來了解決問題了,該是時候把規則定個國際標準了吧! 最後給大家幾個式子看看,並想想為什麼:
你會把它解讀成什麼? 是 Z 還是 Z ÷ n * (X + Y) 為什麼?
你會把它解讀成什麼? 是 Z 還是 Z ÷ 2 * X 為什麼? 3、 (1+1+1+1+1+1)/(1+1)(1+(1+1)) 答案是多少? tag: +6÷2(1+2) tag: +6÷2(1+2) tag: 6÷2(1+2)=? tag: 6/2(1+2) tag: 6/2(1+2) |
|
( 知識學習|科學百科 ) |