来自SICP 2.2.4:
教科书已经定义了一个函数(右拆分.)如下所示:
(定义(右分割画家n) (if (= n0)画家(let ((较小(右拆分画家(- n1)(旁边是画家(较小)
他们已经表明有一个程序(上分裂)。有着相同的结构。
练习2.45。右拆分和上拆分可以表示为一般拆分操作的实例.定义一个过程拆分的属性(定义右拆分(在下面))(定义向上拆分(下面))产生过程的右拆分和上拆分,其行为与已经定义的过程相同。
我编写了以下函数,但我不确定测试它的最佳方法。你认为如何?
(define (split step1 step2)
(define (split-f painter n)
(if (= n 0)
painter
(let ((smaller (split-f painter (- n 1))))
(step2 (step1 smaller smaller)))))
split-f)
(define right-split (split beside below))
(define up-split (split below beside))发布于 2011-04-15 04:30:45
为了测试它,您需要对类似于下面和旁边的东西有定义。教科书代码中有一些奇怪的地方,因为画家的“更小”实际上并没有在代码中缩放,或者它是否表示“下面”和“旁边”缩放他们的论点?总之,你可以定义
(define (below a b) `(below ,a, b))
(define (beside a b) `(beside ,a ,b))因此,例如(右裂‘苹果1号)应该产生的结果。
'(beside apple (below apple apple))您可以从代码的结构中验证代码是否正确工作。
你的(分裂)函数有一个错误,因为在您调用"step2“的行中缺少”油漆工“。代码应改为
(step2 painter (step1 smaller smaller))否则对我来说很好。
https://codereview.stackexchange.com/questions/1895
复制相似问题