我正在尝试在方案中编写一个函数,该方法采用列表并对列表中的每个项目进行平方,然后以(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 :(得分:4)
你几乎就在那里 - 确保你理解cons
和list
之间的区别(教科书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的重要之处在于它将代码缩减到了重要的部分 - 这个代码对列表的每个元素进行了平方,这个代码采用了每个元素的平方根,这个代码添加了一个,等等,而不必重复相同的基本循环迭代代码一次又一次。