Scheme - Recursion:对列表的连续元素求和

时间:2013-11-14 20:37:44

标签: list recursion scheme

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

  1. 获取包含两个以上元素的整数列表作为参数
  2. 求和第n个元素和第(n + 1)个元素
  3. 返回此列表
  4. 结果应如下:

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

    任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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。这是构建列表的自然方式
  • 此过程中不属于解决方案模板的部分是我们在列表中留下单个元素时停止,而不是在列表为空时停止(通常情况下)

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

答案 1 :(得分:1)

#!r6rs
(import (except (rnrs base) map)
        (only (srfi :1) map))

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

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

如果您致电(sum-neighbors '(1 2 3 4)),它将变为(map + (1 2 3 4) (2 3 4)),与(cons (+ 1 2) (cons (+ 2 3) (cons (+ 3 4) '())))

相同