【SICP练习】70 练习2.41

本文介绍如何使用Scheme语言生成三个相异整数构成的三元组,并通过定义谓词判断这些三元组的元素之和是否等于特定值s。文中详细解释了实现过程,包括使用flatmap、map等高阶函数来生成三元组,以及使用filter进行条件筛选。


练习2.41

这道题其实就是书中素数示例的变种,其本质是一样的。因此我们也按照同样的次序来完成这个过程。首先第一步,我们来完成生成3个相异整数构成的三元组。但在上一题中我们已经写出了能够产生2个相异整数构成的二元组了。因此我们只要多产生一个i,让其与产生的二元组结合,便能产生三元组了。那么,开工吧。

(define (unique-triples n)

   (flatmap (lambda (i)

               (map (lambda (j)

                        (cons i j))

                     (unique-pairs (- i 1))))

             (enumerate-interval 1 n)))

然后还需要定义一个谓词来判断这个三元组的三元素之和是否等于s。书中的例子也有一个prime-sum?谓词不是吗。

(define (triples-sum? triples s)

   (= s (+ (car triples)

          (cadr triples)

          (caddr triples))))

通过查询资料发现还有读者作出了一个巧妙地过程。

(define (triples-sum? triples s)

   (= sum (fold-right + 0 triples)))

真的是活学活用啊。

然后还需要一个能够过滤掉不符合条件的三元组的函数。

(define (filter-triples s triples)

  (filter (lambda (x)

            (triples-sum? x s))

        triples))

因此便能产生如题中描述的那般函数了。

版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.youkuaiyun.com/nomasp

转载于:https://my.oschina.net/nomasp/blog/503336

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值