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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值