2017-06-22 52 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))