2009-10-20 42 views
1

我試圖寫一個函數在方案中,它需要列表並正方形列表中的每個項目,然後以(list x y z)的形式返回列表。但是,我不確定如何編寫能夠做到這一點的代碼。到目前爲止,我有方案中的列表

(define (square=list list) 
    (cond 
    [(empty? list) false] 
    [else (list (sqr (first a-list))(square-list (rest a-list)))])) 

,但它的形式

(cons x (cons y (cons z empty))) 

我能做些什麼,使它只是形式(list x y z)返回列表返回列表?謝謝!

+0

爲什麼不問的TA? –

+1

'(cons x(cons y(cons z empty)))'是你想要的。你有什麼是'(名單X(名單Y(表Z)))'這是一樣的'(利弊X(缺點(缺點Y(缺點ž空)空)空)' - 'cons'和'名單'不要做同樣的事情。 –

+0

哎呦,有一個錯誤在那裏,我沒看到... 你* *實際上已經是(名單X(名單Y(表Z)))這是什麼與(cons x(cons y(cons z empty)empty)empty)相同。 –

回答

2

問題是您在else語句中使用了列表。你是在說我把這個值作爲第一個條目,並且把第二個條目作爲列表。 您想將第一個條目放入由遞歸調用創建的列表中。

(list 'a '(b c d)) 
; gives you 
'(a (b c d)) 

(cons 'a '(b c d)) 
; gives you 
'(a b c d) 
4

就快 - 請確保您瞭解conslist之間的差值(教科書How to Design Programs這說明在第13章你可以找到在線副本here)。

cons將把一個項目作爲它的第一個元素和(通常)一個(可能是空的)「休息」部分的列表。例如,(cons 1 empty)的第一個元素的編號爲1,「休息」的列表的編號爲empty(cons 1 (cons 2 empty))具有數字1作爲第一個元素,並且(cons 2 empty)作爲「休息」。

list只是一個簡單的速記列表,取任意數量的項目。因此:

(list 1 2 3 4 5)

是一樣的...

'(1 2 3 4 5)

這是一樣的

(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 empty)))))

但要小心。 (list 1 (list 2 (list 3)))不是(cons 1 (cons 2 (cons 3 empty)))相同。實際上,它是(cons 1 (cons 2 (cons 3 empty) empty) empty)

如果您仍然感到困惑,請隨時發表評論。

1

這可能不是你的電話號碼正在尋找的東西,但是我會拋出它,因爲它可能會幫助你更多地使用Scheme。慣用(方案)的方式來寫你正在嘗試做的是使用map

> (map (lambda (x) (* x x)) '(1 2 3 66 102 10403)) 
(1 4 9 4356 10404 108222409) 

map應用一個函數(在這裏,(lambda (x) (* x x)) - 返回其輸入的平方一個匿名函數)每個元素列表並返回包含所有結果的新列表。 Scheme的map基本上與您在代碼中進行的迭代相同,其優點是通過使用map,您永遠不必明確編寫這樣的迭代(並且至少名義上,Scheme實現可能會以某種特殊方式優化映射,儘管這不是在大多數情況下非常重要)。有關地圖的重要一點是,它降低了代碼的重要組成部分 - 此代碼平方列表中的每個元素,這其他代碼需要每一個元素的平方根,該代碼添加一個到它,等等,而無需重複相同的基本循環迭代代碼。