我想对两对关闭的每个列表求和,并返回一个新列表,其中每个器官是接下来两对的总和。
我有这个代码:
我做错了什么?
(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))
当我运行它时,我得到了错误的语法。 我做错了什么?
谢谢...
答案 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)