上次說到丘齊數的時候並沒有提到怎麼定義後繼函式, succ(n) = n + 1。這兩天讀pierced的書(順便說一句,這本types and programming languages的敘述清晰,推理自然,符號也用得非常簡約。相比那本principles of program analysis,peirce這本書讀起來輕鬆多了。也不知道是作者風格問題,還是型別系統的線條本來就比較清爽)時,突然意識到succ的定義其實暗合(多半是明合,不過我沒有清晰的證明)互動遞迴。先看上次定義的丘齊數:
n = lambda s z.sn z
如果把s看成後繼函式,z看成0,n就很好理解了:對0做n次後繼操作。
現在看後繼函式的定義:succ = lambda n s z. s (n s z)
看到沒有,如果我們同樣把s看作後繼函式,z看成0, 那succ(n)相當於對0做n次後繼操作,然後再做一次。相當於說說succ(n) = n + 1。非常直觀吧?再仔細觀察,丘齊數的定義出現在後繼函式的定義裡,反之亦然。換句話說,俺們用到了互動遞迴。如果有老大不了解互動遞迴,不妨不用任何迴圈語句寫乙個列印有任意結構的樹的程式。
那我們怎麼知道這個互動遞迴收斂呢?那就要看0這個丘齊數的定義了:0 = lambda s z. z。同樣,把s看成後繼函式。s完全沒有被應用到被看作0的z上。換句話說,當n等於0時,succ(n)=succ(0) = s (0 s z) = s z = z = 0。剛好收斂。當然,這不是嚴格的證明。嚴格的證明就留給各位老大了。
最後來道練習題(其實就是pierce書上的練習5.2.2):用另外一種方式定義後繼函式。
互動遞迴和丘齊數
上次說到丘齊數 的時候並沒有提到怎麼定義後繼函式,succ n n 1。這兩天讀pierced的書 順便說一句,這本types and programming languages的敘述清晰,推理自然,符號也用得非常簡約。相比那本principles of program analysis,peirc...
c c 十進位制轉換任意進製數(遞迴和非遞迴)
將非負十進位制整數n轉換成b進製。其中b 2 16 記住這個方法 對於進製轉換類問題,就是不斷的餘b模b。b代表進製數的基數 具體步驟 重複執行 和步驟 直到n為0結束。取b進製數的個位 求餘運算n b,把結果存入陣列。將10進製數降一階 整除運算n n b。逆序輸出陣列元素。如果陣列元素小於10,...
是數還是數列? 遞迴 逼近和傅利葉變換
之前,我們嘗試分析例子中橘子的重量 y 和甜度 x 的關係,也得到了乙個粗略的結論,即 現在我們來試著能否更精確的描述橘子的重量 y 和甜度 x 的關係。為了獲得橘子的重量 y 和甜度 x 之間更加精確的比例關係,我們假設重量 y 除了按某個固定比例 隨甜度 x 變化的部分,還有一部分 是不按固定比...