2013-01-11 90 views
1

返回它已經多少次被稱爲方案會是什麼樣子模擬靜態變量方案

(define count 
    (let ((P 0)) 
    (lambda() 
     (set! P (+ 1 P)) 
     P))) 

(list (count) (count) (count) (count)) ==> (list 1 2 3 4) 

但假設我們有看起來像這樣的

(map ______ lst) 

和表達的功能我們希望評估爲

(list 1 2 3 ... n) 
where n = (length list) 

問題要求我們使用lambda表達式空白,我們不能在空白像使用任何輔助定義(計數),所以

(lambda (x) (count)) 

是不允許的。簡單地用以前的定義替換(計數),如下所示:

(map 
(lambda (x) 
    ((let ((P 0)) 
     (lambda() 
     (set! P (+ 1 P)) 
     P)))) 
L) 

也不起作用。

有什麼建議嗎?

回答

1

你非常非常接近正確的解決方案!在問題的代碼只是這樣做:

  1. 最外層lambda是錯誤的,刪除線和相應的右括號
  2. 最裏面lambda是,最終將被傳遞給map過程之一,所以它需要接收參數(即使它沒有實際使用)
  3. 刪除圍繞let形式

最外面的括號這一切都歸結爲:傳遞給maplambda接收參數,但也包含P變量。 let表格在通過的lambda的上下文中僅定義P一次,並且從lambda的那一點「記住」P的值,因爲對於列表中的每個元素,使用相同的P

+1

謝謝!有效! – user1968574

+0

@ user1968574不客氣!請不要忘記接受對您最有幫助的答案。點擊左邊的複選標記 –

1

你是那裏的90%。在空白處使用count定義的右側,併爲該函數添加(忽略)參數。

+0

如果這是你的意思是: (圖 (拉姆達(X) ((讓((P 0)) (拉姆達() (設置P(+ 1個P)) P))) ) L) 我試過了,它不起作用。 – user1968574

+0

@ user1968574:nope – newacct

+0

然後我不確定是什麼意思「添加一個被忽略的參數到函數中,請您澄清一點嗎? – user1968574