我正在尝试使用Scheme编写一个函数:
结果应如下:
> (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)))))
任何帮助都将不胜感激。
答案 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) '())))