Обратной точки зрения сложите правую и сложите левый


Упражнения 2.39

Заполните следующие определения обратного (упражнение 2.18) с точки зрения фолд-право и фолд-слева от упражнения 2.38:

(define (reverse sequence)
  (fold-right (lambda (x y) <??>) nil sequence))
(define (reverse sequence)
  (fold-left (lambda (x y) <??>) nil sequence))

Я писал этот ответ:

(define (fold-right op initial seq)
  (define (rec rest)
    (if (null? rest) 
        initial
        (op (car rest)
            (rec (cdr rest)))))
  (rec seq))

(define (fold-left op initial seq)
  (define (iter result rest)
    (if (null? rest)
        result
        (iter (op result (car rest)) (cdr rest))))
  (iter initial seq))

(define (reverse sequence)
  (fold-right (lambda (x y) 
                (append  y (list x))) null sequence))

(define (reverse-l sequence)
  (fold-left (lambda (x y) (cons y x)) null sequence))

(define a (list 1 2 3 4 5))


1636
5
задан 12 апреля 2011 в 03:04 Источник Поделиться
Комментарии
2 ответа

Ваша реализация обратного , используя фолд-налево является правильным.

В случае обратного , используя фолд-право, вы можете использовать snoc (описано ниже) в место добавления. Он выглядит лучше и ее сложность не хуже, чем добавить, поэтому нет потери в эффективности:

(define (snoc e lis)
(if (null? lis)
(cons e lis)
(cons (car lis) (snoc e (cdr lis)))))

(define (reverse sequence)
(fold-right (lambda (x y)
(snoc x y)) null sequence))

... или еще более краток:

(define (reverse sequence)
(fold-right snoc null sequence))

Любопытно, что SICP определение сложите левый ОСП аргументы к ОП (но сохраняет правильный порядок аргументов ОП в диван-вправо), в результате чего использование довольно утомительно (лямбда (х г) (г против Х)) а не просто минусы. SRFI-1 получает определений фолд и фолд-правильно Правильно, конечно.

2
ответ дан 13 апреля 2011 в 04:04 Источник Поделиться

Да, youve получил его. Я не думаю, что есть какие-то разумные альтернативы.

Это umderstandable если вы были в надежде избежать присоеденить с какой-то умной комбо минусы/авто/цхд , но я не верю, что есть такой способ.

1
ответ дан 12 апреля 2011 в 05:04 Источник Поделиться