реализовать функцию сканирования в схеме? - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь реализовать функцию (назовем это scan), которая принимает три аргумента. Первый - это процедура с двумя аргументами, второй - начальное значение процедуры, а третий - список элементов, которые нужно обработать с помощью процедуры. Например:

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

и так далее ... Я написал кое-что для нахождения префиксной суммы, которая принимает два аргумента Я пытался использовать это, но это не сработало. Как я могу подойти к этой проблеме?

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

Думайте рекурсивно.

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)

, где newval равно car result (вы не можете сказать car result, конечно, вы должны выразить это по-другому).Если вы умеете читать на Хаскелле, то поучителен источник scanl.

Ах, не домашнее задание, так что тогда:

(define (scan proc val list)
    (if (null? list)
        '()
        (cons (proc val (car list)) (scan proc (proc val (car list)) (cdr list)))))
0 голосов
/ 04 июля 2012
(define (scan f i l)
  (if (empty? l) l (cons (f i (first l)) (scan f i(rest l)))))
0 голосов
/ 15 февраля 2012

Так как это было помечено как ракетка, вот версия, которая использует форму 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))
...