交互递归和丘齐数
来源:互联网 发布:fps鼠标推荐 知乎 编辑:程序博客网 时间:2024/05/17 08:41
上次说到丘齐数 的时候并没有提到怎么定义后继函数, succ(n) = n + 1。这两天读Pierced的书(顺便说一句,这本Types and Programming Languages的叙述清晰,推理自然,符号也用得非常简约。相比那本Principles of Program Analysis,Peirce这本书读起来轻松多了。也不知道是作者风格问题,还是类型系统的线条本来就比较清爽)时,突然意识到succ的定义其实暗合(多半是明合,不过我没有清晰的证明)交互递归。先看上次定义的丘齐数:
n = lambda s z . sn z
如果把s看成后继函数,z看成0,n就很好理解了:对0做n次后继操作。
现在看后继函数的定义:succ = lambda n s z. s (n s z)
看到没有,如果我们同样把s看作后继函数,z看成0, 那succ(n)相当于对0做n次后继操作,然后再做一次。相当于说说succ(n) = n + 1。非常直观吧?再仔细观察,丘齐数的定义出现在后继函数的定义里,反之亦然。换句话说,俺们用到了交互递归。如果有老大不了解交互递归,不妨不用任何循环语句写一个打印有任意结构的树的程序。
那我们怎么知道这个交互递归收敛呢?那就要看0这个丘齐数的定义了:0 = lambda s z. z。同样,把s看成后继函数。s完全没有被应用到被看作0的z上。换句话说,当n等于0时,succ(n)=succ(0) = s (0 s z) = s z = z = 0。刚好收敛。当然,这不是严格的证明。严格的证明就留给各位老大了。
最后来道练习题(其实就是Pierce书上的练习5.2.2):用另外一种方式定义后继函数。
- 交互递归和丘齐数
- 递归和尾递归
- 非递归和递归
- 尾递归和递归
- 递归和尾递归
- 递归和尾递归
- 递归和尾递归
- 递归和尾递归
- 递归和尾递归
- 尾递归和递归
- 递归和尾递归
- 汉若塔递归(读懂递归和写出递归)
- erlang递归和尾递归
- 递归和非递归详解
- 头递归和尾递归
- 递归和递归的应用
- 基本递归和尾递归
- 线性递归和尾递归
- 不会用BLOG
- MASM32编程获取文件最后修改时间
- 上海“生煎”地图大公开
- Creational Pattern之abstract factory pattern
- 敏捷软件开发宣言
- 交互递归和丘齐数
- 哪家银行缩写最牛!
- 系统敏感端口真正的关闭大法
- 应用框架的基本思想
- 两个基本共识—基于构件的软件开发的发展方向
- 合同
- DDOS攻击 如何判断是否遭到流量攻击
- Linux/Unix平台可执行文件格式分析(来自赛迪网)
- 软件反汇编 得到万能注册码