【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)))))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值