合同违规预期:数量? - 方案

时间:2017-03-04 12:36:56

标签: scheme racket

我是球拍和计划的新手,我正在尝试将列表的组合映射到加上功能,该功能采用列表的每个组合并将它们添加到一起,如下所示:

;The returned combinations 
((1 3) (2 3) (1 4) (2 4) (3 4) (1 5) (2 5) (3 5) (4 5) (1 6) (2 6) (3 6) (4    6) (5 6) (1 2) (2 2) (3 2) (4 2) (5 2) (6 2))

; expected results 
((2) (5) (5).....)

不幸的是,我收到了以下代码中的合同违规预期错误:

;list of numbers 
(define l(list 1 2 3 4 5 6 2))

(define (plus l)
(+(car l)(cdr l)))

(map (plus(combinations l 2)))

2 个答案:

答案 0 :(得分:3)

除了@DanD指出的错误之外,您的代码还有一些其他问题。这应该解决它们:

(define lst (list 1 2 3 4 5 6 2))

(define (plus lst) 
  (list (+ (car lst) (cadr lst))))

(map plus (combinations lst 2))
  1. 调用变量l并不是一个好主意,乍一看我认为它是1。最好称之为lst(不是list,请 - 这是一个内置程序)
  2. 在预期的输出中,您不应该生成列表列表吗?将list的来电添加到plus
  3. 您没有以plus期望
  4. 的方式传递map
  5. 请注意缩进和格式化代码的正确方法,它可以帮助您找到错误

答案 1 :(得分:2)

你想要(cadr l)。加号函数中不是(cdr l)

(define (plus l) 
  (+ (car l) (cadr l)))

x (cons 1 (cons 2 '()))的位置:

(car x) => 1
(cdr x) => (cons 2 '())
(cadr x) == (car (cdr x)) => 2