惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
腾讯CDC
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Martin Fowler
Martin Fowler
A
About on SuperTechFans
博客园 - 叶小钗

博客园 - effulgent

D3D11中的MSAA 对SCHEME的一些理解(4) Photoshop DDS转化插件的一些问题 对SCHEME的一些理解(2) 对SCHEME的一些理解(1) 整数二进制补码的数学原理(two's complement) Vray的全局照明(Global Illumination)算法原理与比较(图文) 关于D3D9显示格式的解释 关于光栅化和MSAA的一些讨论 程序员面对分歧和难题应当具备的态度 坐标变换 CGDC见闻 RV870和GT300的一些猜测 在游戏中充分利用可编程的GPU 并行编程的基础 深入理解Direct3D9 深入理解GPU Architecture(上) 深入理解Intel Core Microarchitecture 星际2的一些技术特性
对scheme的一些理解(3)
effulgent · 2012-02-17 · via 博客园 - effulgent

断断续续读到SICP第三章,觉得scheme有点入门了,不过长久不练习,脑子又不能适应函数式编程模式了,觉得3.17、3.18、3.19还比较有意思,贴个自己的解题思路吧。

3.17

(define (count-unique-pair x)
  (let ((db (cons 0 0)))
    (define (count-pair x)
      (define (add-unique-pair x db1)
 (define (add-record db0 x)
   (set-car! db0 x)
   (set-cdr! db0 (cons 0 0))
   x)
 (define (find-record x db0)
   (if (not (pair? (car db0)))
       (add-record db0 x)
       (if (eq? x (car db0))
    '()
    (find-record x (cdr db0)))))
 (find-record x db1))
      (if (not (pair? x))
   0
   (if (null? (add-unique-pair x db))
       0
       (+ (count-pair (car x))
   (count-pair (cdr x))
   1))))
    (count-pair x)))

(define xx '(a b))
(define z1 (cons xx xx))
(define z2 (cons '(a b) '(a b)))
(count-unique-pair z1)

实现比较丑陋,基本还是过程式编程,使用了一个db存储已经遍历过的pair,可以对付带环的表,而且只要此pair已经遍历过,则其子pair也不在遍历了。相比一下纯函数式写法,这种方式还是比较清晰且容易理解的,不过存在内存竞争问题,不能并行运行。

3.18

此题简化了一些,不用考虑car的环,使用3.17的存储做法就OK了。

3.19

这个需要个小trick,要空间常量,意味着不能存储已遍历的pair指针,那我就用时间换空间吧,使用两个指针,A指针一次步进1个pair,B指针一次步进2个pair,如果存在环,B指针会再次追上A指针,每次步进判断指针是否相等就可以知道是否带环了:)