您将如何开发一个函数one
来使用符号列表并返回相同的列表但每个实例都'cat
加倍?
所以例如
(one (cons 'animal(cons 'table (cons 'cat (cons 'bread
empty)))))
我会得到(我想)
(cons 'animal (cons 'table (cons 'cat (cons 'cat (cons 'bread
empty)))))
作为回报。我对这本书感到沮丧并试图弄清楚这一点。
这是在构建另一个列表时如何递归遍历列表的最简单示例之一。你应该自己写,因为你正在学习。我将帮助您了解解决方案的一般结构,填写空白:
(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
,则 cons它的两个副本。
使用问题中的列表对其进行测试:
(copy (cons 'one (cons 'animal (cons 'table (cons 'cat (cons 'bread empty))))))
...这恰好等同于:
(copy '(one animal table cat bread))
无论哪种方式,结果都是具有相同元素的输入列表的副本(每个'cat
找到的两个副本),但位于新的 cons-cells 中。
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))