計算機プログラムの構造と解釈 第二版 P70 問題2.39

この問題は虫食い問題。


で、ポイントは、listはペア同士をくっつけたヤツなんだけど、
それがどういう風な構成になっていれば良いのかっていう事を
知っていれば出来ると思う。


consでいくか、appendをつかうか。みたいな。


あとはリストの左から評価されるか、右から評価されるかをふまえれば、
意外とカリッとできあがる。


実装

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(use ggc.debug.trace)
(use math.mt-random)

(define nil '())


(define (accumulate op initial sequence)
  (if (null? sequence)
    initial
    (op (car sequence)
        (accumulate op initial (cdr sequence)))))


(define fold-right accumulate)


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

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

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

;; main
(define (main args)

  (display "(reverse-r '(1 2 3 4)): ")
  (display (reverse-r '(1 2 3 4)))
  (newline)

  (display "(reverse-l '(1 2 3 4)): ")
  (display (reverse-l '(1 2 3 4)))
  (newline)

  0)


実行

(reverse-r '(1 2 3 4)): (4 3 2 1)
(reverse-l '(1 2 3 4)): (4 3 2 1)

意外と簡単かも。