SICP 2.2.3 对一种数据处理过程的抽象

博客探讨了如何使用SICP中的过程抽象方法来解决特定问题,例如计算0到n偶数的斐波那契数之和。通过枚举、筛选、映射和累加四个普适过程的抽象,实现了模块化的解决方案,从而能够高效地解决一系列类似问题。

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

有一个很简单的问题:对0到n的整数中的偶数的斐波那契数求和。
不对它进行高级抽象的话,问题应该是这样解决的:
Scheme代码:

(define (even_fib n)
    (define (even_fib_it m re)
        (if (= m n)
            (+ re (fib m))
            (even_fib (+ m 1) (+ re (fib m)))))
    (even_fib_it 0 0)) 

在SICP中研究的是对过程抽象解决问题,所以我们可以把它抽象为一类过程:
这里写图片描述

对要处理对象的枚举(enumerate)———对要处理对象的筛选(filter)———对对象的处理(map)———对处理后对象的累加(accumulate)
将其抽象为这一类问题的四个普适过程:
Scheme代码:

枚举(enumerate):

> (define (enumerate m)
    (cond ((null? m) '())
          ((not (pair? m)) (list m))
          (else
            (append (enumerate (car m)) (enumerate (cdr m))))))

筛选(filter):

>(define (filter? proc  m)
    (cond ((null? m)
         '())
          ((null? (cdr m))
              (if (proc m)
                 (cons m '())
                 '()))
          (else
            (if (proc (car m))
                (cons (car m) (filter proc  (cdr m)))
                (filter proc?  (cdr m))))))

处理(map):

> (define (map proc m)
     (cond ((null? m) '())
           ((null? (cdr m)) (cons (proc (car m)) '()))
           (else
             (cons (proc (car m)) (map proc (cdr m))))))

累加(accumulate):

> (define (accumulate m)
    (if (null? (cdr m))
        (car m)
        (+ (car m) (accumulate (cdr m)))))

那么这种模块化后的过程将解决一系列相似过程中的问题。
那么抽象后的Scheme代码:

> (define (even_fibs n)
    (accumulate 
      (map fib
           (fliter
             (enumerate n)))))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值