DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> sicp習題試解 (1.6)
sicp習題試解 (1.6)
編輯:AJAX詳解     
; ======================================================================
;
;          Structure and Interpretation of Computer Programs
;                  (trial answer to excercises)
;
;                  計算機程序的構造和解釋(習題試解)
;
;                                             created: code17 02/24/05
;                                             modifIEd:
; (保持內容完整不變前提下,可以任意轉載)
; ======================================================================

;; SICP No.1.6
;; 本題為理解題

;; 如果將special form "if" 看作普通procedure,把字句(clause)看作參數(Operants),
;; 那麼它和用戶可定義的 "new-if" 的區別在於,if的參數:<predicate> <then-clause>
;; 和 <else-clause> 不需要在代入前evaluate,這相當於采用了normal-order evaluation,
;; 而不是scheme普通procedure采用的applicative-order evaluation。then子句和else
;; 字句中的一個只有在被需要的時候才會evaluate,而另一個根本不會被evaluate。但用戶定義
;; 的procedure "new-if"的3個參數表達式,則都必須在代入前evaluate。

;; 因此,我們可以很容易推斷出new-if的問題
;; 1. 小的問題是效率上不如if,它的then和else字句都要evaluate無論最後是否用得上。
;; 2. 大的問題在於,如果遞歸函數出現於其子句裡,整個evaluation無法終止。
;;    這是因為非無窮遞歸的終止依靠條件判斷,而在new-if中,無論條件子句結果如何,
;;    都必須先進行底層遞歸獲取結果。這樣,在任何第n次procedure的調用中,永遠需要
;;    第n+1次procedure的結果先返回才能決定本層是否終止的問題,這樣就是一個無限遞歸。

;; 所以,可以知道,如果使用new-if替代if,結果是無限遞歸,程序無法終止,交互式解釋器
;; 失去反應。

;; 我們可以猜測,在遞歸函數存在的情況下,語言中一定需要有normal-order evaluation
;; 的成分存在。 否則,考慮遞歸函數f的最一般形式
;; (define (f x)
;;   (g x
;;      (f (h x))))
;; 可以看到(f x)的evaluation需要等待函數g裡的某個參數(f x)先返回值,無限遞歸。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved