列表/复合数据

时间:2013-02-08 19:27:00

标签: scheme racket

你将如何开发一个函数one,它将使用一个符号列表并返回相同的列表,但每个'cat实例都加倍?

所以例如

 (one (cons 'animal(cons 'table (cons 'cat (cons 'bread
    empty)))))

我会(我想)

 (cons 'animal (cons 'table (cons 'cat (cons 'cat (cons 'bread 
    empty)))))

作为回报。我读这本书并试图解决这个问题时感到很沮丧。

2 个答案:

答案 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))