計算機プログラムの構造と解釈 第二版 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