2017-06-22 53 views
0

我想列出从列表开始的一组列表,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))))) 

预先感谢您!

回答

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