你将如何开发一个函数one
,它将使用一个符号列表并返回相同的列表,但每个'cat
实例都加倍?
所以例如
(one (cons 'animal(cons 'table (cons 'cat (cons 'bread
empty)))))
我会(我想)
(cons 'animal (cons 'table (cons 'cat (cons 'cat (cons 'bread
empty)))))
作为回报。我读这本书并试图解决这个问题时感到很沮丧。
答案 0 :(得分:3)
这是如何在构建另一个列表时递归遍历列表的最简单示例之一。你应该自己写,因为你正在学习。我会帮助你解决一下解决方案的一般结构,填写空白:
(define (copy lst)
(if <???> ; is the list empty?
<???> ; if so, return the empty list
(cons <???> ; otherwise `cons` the first element of the list (*)
(copy <???>)))) ; and advance the recursion over the rest of the list
(*)...但如果元素为'cat
,则为两个副本。
使用问题中的列表进行测试:
(copy (cons 'one (cons 'animal (cons 'table (cons 'cat (cons 'bread empty))))))
......这碰巧与此相当:
(copy '(one animal table cat bread))
无论哪种方式,结果都是具有相同元素的输入列表的副本(并且找到了每个'cat
的两个副本),但是位于新的cons-cells中。
答案 1 :(得分:2)
Leppie(他告诉我“在流量中发挥你的变异; p”以回应我上面的set-car!
/ set-cdr!
评论;-))希望我写一个基于折叠的解决方案,所以在这里!
(define (fun lst)
(fold-right (lambda (e r)
(case e
((cat) (cons* e e r))
(else (cons e r))))
'() lst))