球拍。从列表中创建一对列表
问题描述:
我想列出从列表开始的一组列表,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)))))
预先感谢您!
答
你有几个误区:
(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))