Exercise 2.17
#lang racket
(define (last-pair l)
(if (null? (cdr l))
l
(last-pair (cdr l))))
Exercise 2.18
#lang racket
; (define (reverse list)
; (define (mid-reverse list midlist)
; (if (null? list)
; midlist
; (mid-reverse (cdr list) (cons (car list) midlist))))
; (mid-reverse list '()));'() can't be replaced as (list) why?
;use append
(define (reverse items)
(if (null? items)
(list)
(append
(reverse (cdr items))
(list (car items)))))
Exercise 2.19
#lang racket
(define (cc amount coin-values)
(cond ((= amount 0) 1)
((or (< amount 0) (no-more? coin-values)) 0)
(else
(+ (cc amount
(except-first-denomination coin-values))
(cc (- amount
(first-denomination coin-values))
coin-values)))))
(define no-more? null?)
(define except-first-denomination cdr)
(define first-denomination car)
(define us-coins (list 50 25 10 5 1))
(cc 100 us-coins)
Exercise 2.20
#lang racket
;the two number is same even-odd parity?
(define (same-kind? first second)
(= (remainder (- first second) 2) 0))
;compare the first to the rest recursely
(define (same-parity first . dulp)
(let ((dulpp dulp))
(define (parity first dulpp)
(if (null? dulpp)
(list first)
(let ((comparison (car dulpp))
(rest (cdr dulpp)))
(if (same-kind? first comparison)
(cons first (parity comparison rest))
(parity first rest)))))
(parity first dulpp)))
;output
(same-parity 2 4 6 8 9 10)
Summarize
闭包很强大,它允许我们轻松的创造层级结构,换言之,它能够创造很多基本的或复杂的数据结构,比如序列和树。任何强有力的编程语言都会提供这种能力。