2009-10-20 46 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实现可能会以某种特殊方式优化映射,尽管这不是在大多数情况下非常重要)。有关地图的重要一点是,它降低了代码的重要组成部分 - 此代码平方列表中的每个元素,这其他代码需要每一个元素的平方根,该代码添加一个到它,等等,而无需重复相同的基本循环迭代代码。