练习1.43
我不想一开始就将结果贴出啦,而是通过叙述自己的思考来完成这篇博客。上一题中我在纸上写下“传入2个过程并返回1个过程”,事实证明挺有效的,于是这次我也依旧这么做了。
repeated需要传入一个过程和一个数字,这个数字决定了这个过程的执行次数。repeated还要返回1个过程,而这个过程又要传入一个数字,这个数字又将通过前面传入的过程来运算。确实挺绕的。
一开始对于决定这个过程的执行次数这一部分,我想参照练习1.41,还define了一个过程。但不知道怎么把这个过程写入repeated中。于是我将这个过程按如下格式写入repeated中了,编译器报错说这种形式非法。
(define repeated
(define r
(lambda (x)
......
(lambda ......
而后我不再企图单独列出这个要让过程执行多次的部分,而是先暂时将问题简单化。即便是只能做一个唯一的普通的运算也好。
(define repeated
(lambda (f a)
(lambda (b)
(if (= a 2)
(f (f b))
(f b)))))
测试一下。
((repeated square 2) 5)
;Value: 625
接下来就该来个递归了是不是。
在这里我还试过一次在define的过程里又define了一个过程,再次报错。终于博主决定将他们分开写了。
(define repeated-iter
(lambda (f a)
(lambda (b)
(if (= a 1)
(f b)
((repeated-iter f (- a 1)) (fb))))))
(define repeated
(lambda (f a)
(lambda (b)
((repeated-iter f a) b))))
接下来我们来测试一下,这回事真正的测试了。
((repeated square 5) 5)
;Value: 23283064365386962890625
这里我只是挑了一个比较大的数来展示,其为(square(square (square (square (square 5)))))。