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

この問題はずるっこい感じでやってしまった。


説明のところで、
list-refっていう、listの順番の添字から値をとれる手続きを作ったことに加え、
listの長さを求めるlenghという手続きを作ったから


Javaだとかそういうのやったことあるとわかると思うけど、
length - 1
って、最後の値の添字になる。


んだから、後は適当です。


実装

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

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

(define one-through-four (list 1 2 3 4)) 

(define squares (list 1 4 9 16 25))

(define odds (list 1 3 5 7)) 


(define (list-ref items n)
  (if (= n 0)
    (car items)
    (list-ref (cdr items) (- n 1))))


(define (length items)
  (if (null? items)
    0   
    (+ 1 (length (cdr items)))))


(define (length items)
  (define (length-iter a count)
    (if (null? a)
      count
      (length-iter (cdr a) (+ 1 count))))
  (length-iter items 0)) 


(define (append list1 list2)
  (if (null? list1)
    list2
    (cons (car list1) (append (cdr list1) list2))))

;;2.17
(define (last-pair items)
  (list (list-ref items (- (length items) 1))))

;; main
(define (main args)

  (display "one-through-four: ")
  (display one-through-four)
  (newline)

  (display "squares: ")
  (display squares)
  (newline)

  (display "odds: ")
  (display odds)
  (newline)


  (display "(last-pair one-through-four): ")
  (display (last-pair one-through-four))
  (newline)


  (display "(last-pair squares): ")
  (display (last-pair squares))
  (newline)


  (display "(last-pair odds): ")
  (display (last-pair odds))
  (newline)

  0)


実行

one-through-four: (1 2 3 4)
squares: (1 4 9 16 25)
odds: (1 3 5 7)
(last-pair one-through-four): (4)
(last-pair squares): (25)
(last-pair odds): (7)


OK