`
messi_18
  • 浏览: 96368 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sicp practice 1.16重新实现

 
阅读更多
今天重新拿起了SICP,准备继续之前被The Little Schemer打断的计划。
今天重新实现了下第一章的习题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)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics