计划中的列表

时间:2009-10-20 15:38:37

标签: list scheme

我正在尝试在方案中编写一个函数,该方法采用列表并对列表中的每个项目进行平方,然后以(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)的形式返回列表?谢谢!

3 个答案:

答案 0 :(得分:4)

你几乎就在那里 - 确保你理解conslist之间的区别(教科书How to Design Programs在第13节中解释了这一点。你可以找到在线副本{{ 3}})。

cons将把一个项目作为其第一个元素,并且(通常)为“rest”部分的一个(可能是空的)列表。例如,(cons 1 empty)的数字1为第一个元素,empty列表为“rest”。 (cons 1 (cons 2 empty))的数字1为第一个元素,(cons 2 empty)为“rest”。

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 :(得分:2)

问题是你在else语句中使用list。你是说建立一个列表,其中该值为第一个条目,列表为第二个条目。 您希望将第一个条目包含在递归调用创建的列表中。

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

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

答案 2 :(得分:1)

这可能不是你的TA正在寻找的东西,但无论如何我会抛出它,因为它可能会帮助你更多地了解一下Scheme。用于编写您要执行的操作的惯用(在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实现可能会优化map以某种特殊的方式,虽然在大多数情况下并不是那么重要)。关于map的重要之处在于它将代码缩减到了重要的部分 - 这个代码对列表的每个元素进行了平方,这个代码采用了每个元素的平方根,这个代码添加了一个,等等,而不必重复相同的基本循环迭代代码一次又一次。