SICP練習1 6的解答

2022-02-10 13:17:52 字數 862 閱讀 2156

cond和if有著同樣的效果,為啥用cond實現的new-if不能用於一些函式?

解答1:

if和cond都是特定的求值順序, 

即先對判斷求值,再根據其結果選擇需要求值的部分 

既不是應用序也不是正則序 

new-if改變了if的特殊性, 

如果直譯器是應用序,則引數需要先行代換,而導致問題 

如果直譯器是正則序,則好像無法支援遞迴,同樣也有問題

解答2:

引用原文:

運算元等進行求值,然後才會將運算元應用到操作符上進行運算。在我們的newif例子中,直譯器試圖首先對newif的三個運算元predication ,

then-clause和 else-clause進行求值,完成求值後才會進行cond運算。而在階乘函式中,else-clause就是(* n (n! (- n 1)))表示式。

在這個表示式的求值過程中又遞迴呼叫了n!函式,如此反覆,每次都在有機會進行cond運算之前就呼叫了n!,由於cond從無機會進行運算,

遞迴的結束條件永遠不會被測試,遞迴呼叫無限進行,直到stack overflow... 那麼為什麼直接在n!中直接使用if或cond就一切正常呢?

原因是cond或if作為特殊的運算子,含有它們的表示式的求值實際上是不遵循應用序的,實際上,含有cond或if的表示式求值時總是要先對條件

運算元進行求值直到獲得true或false,然後再根據得到的結果決定是否對別的運算元進行求值。在採用if的n!版本中,直譯器總是先求值(= n 1),

再決定對哪個分支求值。這樣由於遞迴的結束條件在每次呼叫中都是最先求值,無限遞迴就不會出現了。而newif對cond包裝後,cond的特殊性

就被遮蓋了,newif被當作了普通表示式,災難出現。」

SICP習題1 6的解答

sicp就是名著 structure and interpretation of computer programs 著名的巫師書 wizard book 和紫書 purple book 雖說英文原版可以從網上合法 中文版翻譯也還不錯。閒話少敘,下面我們研究一下書中 1.1.7節的練習題1.6。原題...

SICP練習 2 練習1 6

練習1.6 這道題通過由乙個新版本的 if來引出,主要討論的還是應用序和正則序的問題。我看到 將 if提供為一種特殊形式 時還滿頭霧水,並不太清楚什麼特殊形式。當再返回看 if的語法時才發現,這在第12頁 if的一般表示式下面一段。如果 得到真值,直譯器就去求值 並返回其值。注意,在此處已經返回其值...

SICP習題解答1 1 1 8

lang racket exercise 1.1 10 5 3 4 9 1 6 2 2 4 4 6 define a 3 define b a 1 a b a b a b if and b a b a b ba cond a 4 6 b 4 6 7 a else 25 2 if b a b a co...