0

我正在尝试使用 Scheme 编写一个函数:

  1. 将具有两个以上元素的整数列表作为参数
  2. 对第 n 个元素和第 (n+1) 个元素求和
  3. 返回此列表

结果应如下所示:

> (SumNeighbors (list 1 2 3 4))
(3 5 7)

我想我得到了添加元素的方法,但我的递归完全错误......

(define (SumNeighbors lst)
  (if (not (null? (cdr lst)))
      (append (list (+ (car lst) (car (cdr lst)))) (SumNeighbors (cdr lst)))))

任何帮助,将不胜感激。

4

2 回答 2

3

这个问题的解决方案遵循一个众所周知的模式。我给你一些提示,如果你通过自己的方式找到答案会更有趣:

(define (SumNeighbors lst)
  (if <???>                    ; if there's only one element left
      <???>                    ; we're done, return the empty list
      (cons                    ; otherwise call `cons`
       (+ <???> <???>)         ; add first and second elements
       (SumNeighbors <???>)))) ; and advance recursion

请注意以下事项:

  • 您的解决方案缺少基本情况 - 当我们遍历的列表只剩下一个元素时会发生什么?是时候完成递归了!并且因为我们正在构建一个列表作为输出,所以返回的值应该是什么?
  • 我们通常用于cons构建输出列表,而不是append. 这是建立列表的自然方式
  • 这个过程中不属于解决方案模板的部分是当列表中只剩下一个元素时我们停止,而不是当列表为空时(通常情况下)

您将看到许多迭代输入列表并返回列表作为输出的过程遵循相同的解决方案模板,了解其工作原理和原因非常重要,这是编写其他类似问题的解决方案的基础。

于 2013-11-14T20:58:25.160 回答
1
#!r6rs
(import (except (rnrs base) map)
        (only (srfi :1) map))

(define (sum-neighbors lst)
  (map + lst (cdr lst)))

SRFI-1map中定义的高阶函数支持不均匀长度参数。它将停在最短的列表上。

如果您调用(sum-neighbors '(1 2 3 4))它将成为(map + (1 2 3 4) (2 3 4))(cons (+ 1 2) (cons (+ 2 3) (cons (+ 3 4) '())))

于 2013-11-14T21:20:07.890 回答