List 计划中的列表
我正在尝试在scheme中编写一个函数,它获取一个列表并对列表中的每个项目进行平方运算,然后以List 计划中的列表,list,scheme,List,Scheme,我正在尝试在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 (
(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)
的形式返回列表?谢谢 问题是您在else语句中使用了list。您的意思是创建一个列表,该值作为第一个条目,列表作为第二个条目。
您希望将第一个条目保存到递归调用创建的列表中
(list 'a '(b c d))
; gives you
'(a (b c d))
(cons 'a '(b c d))
; gives you
'(a b c d)
问题是您在else语句中使用了list。您的意思是创建一个列表,该值作为第一个条目,列表作为第二个条目。 您希望将第一个条目保存到递归调用创建的列表中
(list 'a '(b c d))
; gives you
'(a (b c d))
(cons 'a '(b c d))
; gives you
'(a b c d)
你就快到了——确保你理解了cons
和list
之间的区别(教科书第13节对此进行了解释。你可以在网上找到)
cons
将项目作为其第一个元素,并(通常)为“其余”部分提供一个(可能为空)列表。例如,(cons 1 empty)
将数字1作为其第一个元素,empty
列表作为“rest”(cons 1(cons 2 empty))
将数字1作为第一个元素,将(cons 2 empty)
作为“剩余”
list
只是制作列表的一种简单快捷方式,可以包含任意数量的项目。因此:
(列表12345)
和…一样
”(12345)
这和
(cons 1(cons 2(cons 3)(cons 4(cons 5 empty)()))
)
但是要小心<代码>(列表1(列表2(列表3))与(cons 1(cons 2(cons 3 empty))
不同。事实上,它是(cons 1(cons 2(cons 3 empty)empty)empty)
如果您仍然感到困惑,请随时发表评论。您就快到了——请确保您理解缺点和列表之间的区别(教科书在第13节对此进行了解释。您可以在网上找到副本)
cons
将项目作为其第一个元素,并(通常)为“其余”部分提供一个(可能为空)列表。例如,(cons 1 empty)
将数字1作为其第一个元素,empty
列表作为“rest”(cons 1(cons 2 empty))
将数字1作为第一个元素,将(cons 2 empty)
作为“剩余”
list
只是制作列表的一种简单快捷方式,可以包含任意数量的项目。因此:
(列表12345)
和…一样
”(12345)
这和
(cons 1(cons 2(cons 3)(cons 4(cons 5 empty)()))
)
但是要小心<代码>(列表1(列表2(列表3))
与(cons 1(cons 2(cons 3 empty))
不同。事实上,它是(cons 1(cons 2(cons 3 empty)empty)empty)
如果您仍然感到困惑,请随时发表评论。这可能不是您的助教想要的,但我还是会把它放进去,因为它可能会帮助您了解更多的计划。编写您要做的事情的惯用方法是使用map
:
> (map (lambda (x) (* x x)) '(1 2 3 66 102 10403))
(1 4 9 4356 10404 108222409)
map
将一个函数(此处为(lambda(x)(*x))
-一个返回其输入平方的无名函数)应用于列表的每个元素,并返回一个包含所有结果的新列表。Scheme的map
基本上与您在代码中所做的迭代相同,其优点是,通过使用map
您永远不必显式地编写这样的迭代(并且,至少名义上,Scheme实现可能以某种特殊方式优化map,尽管在大多数情况下这并不重要)。map的重要之处在于,它将您的代码简化为重要的部分-此代码对列表中的每个元素进行平方运算,此其他代码取每个元素的平方根,此代码向其中添加一个元素,等等,而无需反复重复相同的基本循环迭代代码。这可能不是您的TA想要的,但我还是要把它扔进去,因为它可能会帮助你们探索更多的计划。编写您要做的事情的惯用方法是使用map
:
> (map (lambda (x) (* x x)) '(1 2 3 66 102 10403))
(1 4 9 4356 10404 108222409)
map
将一个函数(此处为(lambda(x)(*x))
-一个返回其输入平方的无名函数)应用于列表的每个元素,并返回一个包含所有结果的新列表。Scheme的map
基本上与您在代码中所做的迭代相同,其优点是,通过使用map
您永远不必显式地编写这样的迭代(并且,至少名义上,Scheme实现可能以某种特殊方式优化map,尽管在大多数情况下这并不重要)。map的重要之处在于,它将您的代码简化为重要的部分—此代码对列表中的每个元素进行平方运算,此其他代码取每个元素的平方根,此代码向其中添加一个元素,等等,而无需反复重复相同的基本循环迭代代码。(cons x(cons y(cons z empty)))
就是您想要的。你所拥有的是(列表x(列表y(列表z)))
这和(cons x(cons y(cons z empty)empty)empty)是一样的-cons
和list
没有做同样的事情。哎呀,上面有一个我没有看到的错误…你实际拥有的是(列表x(列表y(列表z)),这和(列表x)是一样的(cons y(cons z empty)empty)empty。(cons x(cons y(cons z empty))
是您想要的。您拥有的是(list x(list y(list z)))
,与(cons x(cons y))相同(