Hatena::Groupcsnagoya-sicp

クラなんとかの日記 このページをアンテナに追加 RSSフィード

 | 

2009-06-16掃除中

2.39

| 2.39 - クラなんとかの日記 を含むブックマーク はてなブックマーク - 2.39 - クラなんとかの日記 2.39 - クラなんとかの日記 のブックマークコメント

reverse を fold-{right, left} を使って書け.という問題

fold-right が再帰.fold-left が反復ということがわかればいい感じかな?

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

;; 準備
(define nil (list))

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

;; 確認
(define x (list 1 2 3))

(display x) (newline) ; (1 2 3)
(display (reverse-r x)) (newline) ; (3 2 1)
(display (reverse-l x)) (newline) ; (3 2 1)
 |