• 《sicp》模块化程序设计 笔记


    《sicp》模块化程序设计

    2.2.3 序列作为一种约定界面 学习笔记

    这节中,讲述了一种模块化的程序设计思想,也就是将程序设计为如同信号处理过程一样,采用级联的方式将程序各个部分组合在一起,程序的每一部分对应于一个处理过程,并通过约定的界面将程序各个部分连接在一起.在本节中将序列作为一种约定界面.

    实例

    给定自然数n,找到所有的有序队i和j (i,j小于等于n大于等于0) ,其中i小于j , 使得i+j为素数.

    分析

    如采用模块化设计,可以将程序分为以下几个部分

    1.列出所有的有序对,并用序列组织起来
    2.过滤掉序列中不满足和为素数的有序对.
    3.将序列中每个序队的和添加进序对组成三元组,输出最后结果

    1.生成所有有序对

    生成方法:对每个i小于等于n,枚举出所有的整数 j小于i ,并对每一对i和j生成序对 (i,j).

    
    (define ( accumulate op initial sequence)
     (if (null? sequence)
         initial
         (op (car sequence)  (accumulate op initial (cdr sequence)) )
     )
    )
    (define (emuerate-interval low high) 
      (if (> low high)
          '()
          (cons low (emuerate-interval (+ low 1) high))
      )
    )
    (define (unique-pairs  n) 
     (accumulate append '() 
       (map (lambda (x)
    		  (map (lambda (y)  (list  x y )) 
    		       (emuerate-interval 1 (- x 1) )
    		  )
    		)
    	(emuerate-interval 1 n) )
     )
    )
    
    

    2.过滤序列

    过滤模板程序

    (define (filter predicate sequence)
        (cond ((null? sequence) '())
    	      ((predicate (car sequence)) (cons (car sequence) (filter predicate (cdr sequence))))
    	      (else (filter predicate (cdr sequence)))
        )
    )
    
    (define (prime-sum?  pair) 
     (prime? (+ (car pair)  (cadr pair)))
    )
    

    3.组合结果

    (define (make-pair-sum l)
     (map (lambda (pair) (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) l  )
    )
    

    最终程序

    (define (prime-sum-pairs n)
     (make-pair-sum 
         (filter prime-sum? 
    		 (unique-pairs n))
     )
    )
    
  • 相关阅读:
    有关 JavaScript 的 10 件让人费解的事情
    Apache ab介绍1
    Oracle Raw,number,varchar2... 转换
    Flex开发者需要知道的10件事
    linux命令之nice
    JavaIO复习和目录文件的复制
    使用php获取网页内容
    linux 安装sysstat使用iostat、mpstat、sar、sa
    SQL Injection 实战某基金
    ubuntu root锁屏工具
  • 原文地址:https://www.cnblogs.com/battzion/p/4354568.html
Copyright © 2020-2023  润新知