scheme - 如何修复列表中近对总和的错误

标签 scheme lisp racket

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

我有这个代码:

我做错了什么?

(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))

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

谢谢...

最佳答案

有几个语法问题。对于初学者,您忘记关闭 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)

关于scheme - 如何修复列表中近对总和的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090785/

相关文章:

scheme - 在两个列表上运行的函数

functional-programming - Racket - Closure/Currying,区别在哪里?

scheme - Racket 累加器列表功能

lisp - 使用 SETF 函数扩展 SETF 是如何工作的?

lisp - 尾递归Collat​​z猜想为什么会导致Scheme中的栈溢出?

lisp - 常见的 Lisp 循环问题

include - Racket 方案 : Include externel rkt file with dynamic file name

lisp - 计划中的展开功能

scheme - 如何将运算符传递给方案函数

scheme - 使用 argmax 查找元素列表中的最大数