計算機プログラムの構造と解釈 第二版 P63 問題2.27
題意としては、
・深いとこまでreverseしちゃう手続き、deep-reverseを定義
出力する値の例は問題に乗っているので割愛。
ちょっと本気で考えて、append使わない版もつくってみたよ。
んでは、実装
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- ;;2.18 (define (reverse items) (define (reverse-in vs result) (if (null? vs) result (reverse-in (cdr vs) (cons (car vs) result)))) (reverse-in items nil)) (define (reverse items) (if (null? items) items (append (reverse (cdr items)) (list (car items))))) (define (deep-reverse items) (if (pair? items) (append (deep-reverse (cdr items)) (list (deep-reverse (car items)))) items)) (define (deep-reverse2 items) (define (reverse-in vs result) (if (null? vs) result (if (pair? (car vs)) (reverse-in (cdr vs) (cons (deep-reverse2 (car vs)) result)) (reverse-in (cdr vs) (cons (car vs) result))))) (reverse-in items nil)) (define nil '()) (define x (list (list 1 2) (list 3 4))) ;; main (define (main args) (display "x: ") (display x) (newline) (display "(reverse x): ") (display (reverse x)) (display "(deep-reverse x): ") (display (deep-reverse x)) (newline) (display "(deep-reverse2 x): ") (display (deep-reverse2 x)) (newline) 0)
実行
x: ((1 2) (3 4)) (reverse x): ((3 4) (1 2)) (deep-reverse x): ((4 3) (2 1)) (deep-reverse2 x): ((4 3) (2 1))
うす。