在计划中实现扫描功能?

时间:2012-02-13 13:48:56

标签: scheme racket

我正在尝试实现一个带有三个参数的函数(让我们称之为扫描)。第一个是两个参数过程,第二个是过程的初始值,第三个是使用过程处理的项目列表。例如:

(scan + 0 '())==> '()
(scan + 0 '(1))==> '(1)
(scan + 0 '(1 2 3 4 5));; 1+0, 2+1+0, 3+2+1+0, ...==> '(1 3 6 10 15)

依旧...... 我编写了一些用于查找带有两个参数的前缀sum的内容。我尝试使用它,但它没有用。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

递归思考。

scan proc val list = if null list
                        then the result is an empty list
                        else the car of the result is (proc val (car list))
                             and the cdr of the result is scan proc newval (cdr list)

其中newvalcar result(你不能说car result,当然,你必须以不同的方式表达它。 如果你能阅读Haskell,那么查看scanl的来源将是有益的。

啊,不是家庭作业,所以那么:

(define (scan proc val list)
    (if (null? list)
        '()
        (cons (proc val (car list)) (scan proc (proc val (car list)) (cdr list)))))

答案 1 :(得分:0)

由于这是标记的球拍,因此这是一个使用for/fold形式的版本:

(define (scan f seed ls)
  (define-values (discard results)
    (for/fold ([seed seed]
               [results null]) ([elem (in-list ls)])
      (let ([next-seed (f elem seed)])
        (values next-seed
                (cons next-seed results)))))

  (reverse results))

答案 2 :(得分:0)

(define (scan f i l)
  (if (empty? l) l (cons (f i (first l)) (scan f i(rest l)))))