今天重新拿起了SICP,准备继续之前被The Little Schemer打断的计划。
今天重新实现了下第一章的习题16,还重新实现了那个测试工具。
习题代码:
测试工具代码(和之前比,变化是如果测试失败会打出实际结果):
测试用例:
测试结果:
今天重新实现了下第一章的习题16,还重新实现了那个测试工具。
习题代码:
(define square
(lambda (n)
(* n n)))
(define fast-expt
(lambda (a n ex)
(cond
((zero? a) 0)
((zero? n) ex)
((even? n) (fast-expt (square a) (/ n 2) ex))
(else (fast-expt a (- n 1) (* ex a))))))
测试工具代码(和之前比,变化是如果测试失败会打出实际结果):
(define testN
(lambda (func test-cases)
(cond
((null? test-cases) '())
(else (map (lambda (it)
(let ((v (apply func (car it)))) (if (eq? v (car (cdr it))) #t v))) test-cases)))))
测试用例:
(testN fast-expt '(
((0 0 1) 0)
((2 0 1) 1)
((2 1 1) 2)
((1 2 1) 1)
((2 3 1) 8)
((2 5 1) 32)
((2 10 1) 1024)
)
)
测试结果:
'(#t #t #t #t #t #t #t)