球拍。从列表中创建对列表

时间:2017-06-22 10:01:30

标签: racket

我想从列表开始制作一对列表,cdr将始终相同。例如,(make-pair '(1 2 3 4 5))应返回'((1.a)(2.a)(3.a)(4.a)(5.a))

这是我正在开发的代码,但它不起作用,我不知道如何调试它。

(define (make-pair lst)
 (if (null? (car lst))
      '()
      (cons ((car lst) ".a")
            (make-pair (cdr lst)))))

提前谢谢!

1 个答案:

答案 0 :(得分:0)

你有几个错误:

(define (make-pair lst)
  (if (null? (car lst))      ; - the base case is when the list is null
      '()
      (cons ((car lst) ".a") ; - there's a missing cons
                             ; - `a` appears to be a symbol, not a string
                             ; - that's not how we create a dotted pair
                             ; - the surrounding `()` are misplaced
            (make-pair (cdr lst)))))

这是正确的方法:

(define (make-pair lst)
  (if (null? lst)
      '()
      (cons (cons (car lst) 'a)
            (make-pair (cdr lst)))))

甚至更好,使用内置程序:

(define (make-pair lst)
  (map (lambda (n) (cons n 'a))
       lst))

无论哪种方式,它都按预期工作:

(make-pair '(1 2 3 4 5))
=> '((1 . a) (2 . a) (3 . a) (4 . a) (5 . a))