1

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

所以例如

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

我会得到(我想)

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

作为回报。我对这本书感到沮丧并试图弄清楚这一点。

4

2 回答 2

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,则 cons它的两个副本。

使用问题中的列表对其进行测试:

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

...这恰好等同于:

(copy '(one animal table cat bread))

无论哪种方式,结果都是具有相同元素的输入列表的副本(每个'cat找到的两个副本),但位于新的 cons-cells 中。

于 2013-02-08T19:40:27.947 回答
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))
于 2013-02-08T20:14:20.167 回答