如何使用列表中的接近对总和修复错误

时间:2019-05-11 13:29:49

标签: scheme lisp racket

我想对两对关闭的每个列表求和,并返回一个新列表,其中每个器官是接下来两对的总和。

我有这个代码:

我做错了什么?

(define (add-consecutives lst)
(if (null? (Cdr lst)
                 Null
                (cons
                      (+ (car lst) (cadr lst)
                       (add-consecutives (cadr lst )))))))

(add-consecutives (list 1 2 3 4))

当我运行它时,我得到了错误的语法。 我做错了什么?

谢谢...

1 个答案:

答案 0 :(得分:2)

存在两个语法问题。对于初学者,您忘记为null?调用关闭括号,并且递归步骤中的括号也放错了位置。可以通过适当地缩进代码并使用带有语法高亮显示的IDE来避免所有这些情况。

也有更深层次的问题。推进递归的方式不正确(您需要移至列表的其余部分),并且当剩下0、1、2个元素时,应该处理边缘情况。这应该解决所有问题:

(define (add-consecutives lst)
  (cond ((null? lst) null)
        ((null? (cdr lst))  (list (car lst)))
        ((null? (cddr lst)) (list (+ (car lst) (cadr lst))))
        (else (cons (+ (car lst) (cadr lst))
                    (add-consecutives (cdr lst))))))

让我们尝试一些测试:

(add-consecutives (list))
=> '()
(add-consecutives (list 1))
=> '(1)
(add-consecutives (list 1 2))
=> '(3)
(add-consecutives (list 1 2 3))
=> '(3 5)
(add-consecutives (list 1 2 3 4))
=> '(3 5 7)