复合数据
本文基于 SICP 2.4 - 2.6,介绍三种另类的数据存储结构。
函数工厂
构造函数
(define (cons x y)
(lambda (m) (m x y)))
构造函数返回的是一个“装饰器”,它完成如下映射:
实际上是把数据存在了函数闭包里,数据提取函数只要传入返回相应参数的函数就可以了。
左提取
(define (car z)
(z (lambda (p q) p)))
右提取
(define (cdr z)
(z (lambda (p q) q)))
用例
> (car (cons 109 77))
109
因式分解
可以建立一个数到序对的双射吗?至少对于正整数是可以的:
质因数分解的结果是唯一的,可以用来实现。
代码
使用sumpy
数论库:
from sympy.ntheory import factorint
class pair:
def __init__(self, a, b):
self.hash = (2**a) * (3**b)
def car(self):
return factorint(self.hash)[2]
def cdr(self):
return factorint(self.hash)[3]
用例
p = pair(6, 12)
p.hash
> 34012224
p.car()
> 6
Church 计数
用演算模拟自然数,被写为:
零的定义
(define zero (lambda (f) (lambda (x) x)))
加1
(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x)))))
加法
(define (add a b)
(lambda (f)
(lambda (x)
((a f) ((b f) x)))))
来源:CSDN
作者:__Lysias__
链接:https://blog.csdn.net/weixin_42156883/article/details/104116977