【SICP练习】38 练习1.43



练习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)))))

版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。

posted @ 2015-02-17 20:04  nomasp  阅读(149)  评论(0编辑  收藏  举报