球拍复制器功能

时间:2016-03-03 19:51:23

标签: racket

我正在使用球拍编写复制器功能。复制器函数采用嵌套的符号和数字L列表,并通过&#34生成符号和数字的嵌套列表;立即复制"各级的每个原子(符号或数字)。 例如: (复制器'(a 1 b 2 c 3))产生(a a 1 1 b b 2 2 c c 3 3), (复制器'((a 1)b((c))2)产生((a a 1 1)b b((c c))2 2)。

这是我的功能:

(define (duplicator ls)
  (if (null? ls)
      '()
      (cons (car ls)
            (cons (car ls)
                  (duplicator (cdr ls))))))

我遇到的问题是(复制器'((a 1)b((c))2))的输出是'((a 1)(a 1)bb((c) )((c))2 2),这不是我想要的。 谁能告诉我如何做到正确,拜托?

1 个答案:

答案 0 :(得分:1)

这是一个解决方案:

(define (duplicator ls)
  (cond ((null? ls) '())
        ((list? (car ls)) (cons (duplicator (car ls)) (duplicator (cdr ls))))
        (else (cons (car ls) (cons (car ls) (duplicator (cdr ls)))))))

(duplicator '((a 1) b ((c)) 2))  ; produces ((a a 1 1) b b ((c c)) 2 2)