SICP 2.2 嵌套映射

本文介绍了一种不使用循环控制语句而直接利用函数生成数对的方法,并通过定义特定函数来筛选出和为素数的数对。此外,还详细展示了如何在Scheme语言环境中实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一节,我们来做一个map,筛选出以下数对里和为素数的数对

c/r1234
1(1 1)
2(2 1)(2 2)
3(3 1)(3 3)
4(4 1)(4 2)(4 3)(4 4)

这种生成素数序对的过程,可以抽象成以下两个大过程:
构建序对—-筛选序对
函数意义上来讲,就是筛选构建好的序对

构建序对:

构建这些序列,在C系语言中,用for或者while循环是很容易实现的:

for(i = 1; i <=4 ; i++)
    for(j = 1; j <= i; j++)
            cons(i, j);

但是不用循环控制语句,直接用函数怎样生成这些序列呢?

> (define (make_cons n)
      (accumulate append
                    '()
                    (map (lambda (i)
                            (map (lambda (j) (list i j))
                                 (enumerate_interval 1 i)))
                         (enumerate_interval 1 n))))

生成序列(list 1 2 3 4 … n)
对于每个元素映射生成子表 1 => (list 1)
对于生成的的序列再映射生成子表 ((list 1 1))
对于每个元素映射生成子表 2 => (list 1 2)
对于生成的的序列再映射生成子表((list 2 1) (list 2 2))
对于每个元素映射生成子表 3 => (list 1 2 3)
对于生成的的序列再映射生成子表((list 3 1) (list 3 2) (list 3 3))

这是两级嵌套映射,当然还可以有三级嵌套映射、四级嵌套映射……
将其独立出来成一个过程为:

(define (flatmap proc sequence)
    (accumulate append '() (map proc sequence)))

筛选序对:

检查是否为素数的函数:

> (define (prime? n)
    (define (iter i)
      (cond ((= i n) #t)
            ((= (mod n i) 0) #f)
            (else
              (iter (+ i 1)))))
    (iter 2))

(也可以用更高效的费玛小定律判定是否为素数)

检查序对和是否为素数的函数:

> (define (prime_pair? pair)
    (if (prime? (+ (car pair) (cadr pair))) #t #f))

生成的结果为一个三元组(x y (x + y)),生成三元组的函数:

> (define (make_pair pair)
    (list (car pair) (cdr pair) (+ (car pair) (cdr pair))))

最终Scheme代码:

> (define (prime_sum_pairs n)
    (map make_pair
         (filter prime_sum?
                 (flatmap
                   (lambda (i)
                     (map (lambda (j) (list i j))
                          (enumerate_interval 1 (- i 1)))) ;构造从1i-1的序列即可
                   (enumerate_interval 1  n)))))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值