今天這講,我們將複習一下前三章學過的內容。我們可以試試以下幾個問題,看看有沒有好的解決方案。
1、請將下列表示式變換為字首形式。
(5 + 4 + (2 - (3 - (6 + 4 / 5)))) / (3 * (6 - 2) * (2 - 7))
呵呵,這種問題,我們處理起來可以借用分治處理方法。
我們首先對整個表示式進行劃分,這裡比較明顯的是乙個除法操作將兩個表示式隔開。因此,我們可以先把除法操作作為第乙個分界點。
然後,我們可以分別對左子表示式和右子表示式進行求解。這裡,左、右子表示式可以用順序求值方法得到結果。
2、請定義乙個過程,它以三個數作為引數,返回其中較大的兩個數之和。
這個問題,我們用常規的思考方法,是對這三個引數兩兩比較,把較大的兩個挑選出來。
如果我們用cond表示式的話一共有三種情況(假定三個引數是x,y,z):(x, y),(x, z),(y, z)。
那麼我們可以用下列方法求解:
當然,作為函式式程式語言的乙個非常重要的特性就是遞迴的執行效率。由於fpl大多採用解釋執行的方式,因此在進行遞迴時,不會使應用程式的棧溢位,這樣我們就能大膽地使用遞迴,來簡化表示式。下面就提供這個問題的遞迴解法:
這個思路其實也很清晰。先嘗試選出y和z,如果不滿足情況,那麼遞迴判斷z和x,最後再判斷x和y。
3、ben bitdiddle發明了一種檢測方法,能夠確定直譯器究竟採用哪種順序求值,採用應用序還是正則序。他定義了兩個過程:
如果是應用序求值會得到什麼結果?正則序會得到什麼結果?
如果是應用序的話,在呼叫test之前就會把(p)給計算出來,然後代入test中去計算。如果是正則序的話則相當於把test看作為乙個巨集,直接把(p)表示式代入到test中,等到要獲得其結果時再做計算。
mit-gnu-scheme採用的是應用序,因此這個值是無法被求出的。如果是正則序的話我們應該獲得結果0。
最美麗的傳說
在ilc 2002大會上前lisp大神,當今的python倡導者peter norvig,由於某些原因,做乙個類似於馬丁路德在梵蒂岡宣揚新教的主題演講,因為他在演講中大膽地聲稱python就是一種lisp。講完後進入提問環節,出乎我意料的是,peter點了我過道另一側,靠上面幾排座位的乙個老頭,他衣...
中國最美麗的MVP
前面的話 誰說女子不如男,多有巾幗勝英雄。在微軟mvp的大陣營裡,自然不乏巾幗專家們的秀麗身影,她們在各自的領域以其過人的魅力與出類拔萃的能力贏得了尊重。在七月流火的季節裡,微軟公布了2008年度7月新一屆mvp的名單。這其中作為it168技術頻道資深編輯的胡銘婭小姐的當選倍為引人注目。對於這樣一位...
中國最美麗的MVP
胡銘婭 michelle hu it168技術頻道資深編輯,曾任電子工業出版社計算機圖書事業部編輯,編輯出版了多本暢銷計算機圖書。2007年加入it168技術頻道,負責.net sql server等微軟技術相關頻道,以及it人生 圖書等欄目。專注於微軟技術跟蹤報道和推廣,對.net技術有著獨特的理...