用不动点组合子解递归(python实现)
不动点组合子
Y = λf. (λx. f (x x)) (λx. f (x x))
θ = (λx. λy. (y(x x y))) (λx.λy.(y(x x y)))
Y f = f (Y f)
θ f = f (θ f)
设
h1 =λx.f(x x)
h2 =λx.λy.(y(x x y))
简化为:
Y = λf. h1(h1)
θ = h2(h2) 递归求解
ƒ(n) = n*ƒ(n-1)
ƒ(0) = 1
简记为: ƒ = λn.n׃(n-1) #ƒ对应代码中的 factorial
用归纳法可证ƒ唯一,
设 g = λƒ.λn.n׃(n-1) #g对应代码中的_factorial
则g ƒ = λn.n׃(n-1) = ƒ
因为g(Y g)=(Y g)
所以Y g为ƒ的唯一解
即ƒ(n)=(Y g)(n)=(Θ g)(n)
def _factorial(f):
def factorial(n):
if not n:
return 1
else:
return n * f(n - 1)
return factorial def Y(f):
def h(x):
return f(lambda v: x(x)(v))
return h(h) def O(f):
def h(x):
return (lambda y: y(lambda v: x(x)(y)(v)))
return h(h)(f) #Y(_factorial)(5)
#O(_factorial)(5) #Y = lambda f: (lambda x:f(lambda v:x(x)(v)))(lambda x:f(lambda v:x(x)(v)))
#YY = lambda f: ((lambda x: x(x))(lambda y: f(lambda v: y(y)(v))))
参考:
http://www.cnblogs.com/ldp615/archive/2013/04/09/recursive-lambda-expressions-1.html
http://www.cnblogs.com/ldp615/archive/2013/04/09/recursive-lambda-expressions-2.html
http://www.cnblogs.com/ldp615/archive/2013/04/10/recursive-lambda-expressions-3.html
http://www.cnblogs.com/ldp615/archive/2013/04/10/recursive-lambda-expressions-4.html
http://www.cnblogs.com/ldp615/archive/2013/04/11/recursive-lambda-expressions-5.html
http://www.pythontip.com/blog/post/12174/
用不动点组合子解递归(python实现)的更多相关文章
- Lambda演算 - 简述Y组合子的作用
Y组合子:\f.(\x.f(xx))(\x.f(xx)),接受一个函数,返回一个高阶函数 Y组合子用于生成匿名递归函数. 什么叫匿名递归函数,考虑以下C语言递归函数 int sum(int n) { ...
- 简单易懂的程序语言入门小册子(4):基于文本替换的解释器,递归,如何构造递归函数,Y组合子
递归.哦,递归. 递归在计算机科学中的重要性不言而喻. 递归就像女人,即令人烦恼,又无法抛弃. 先上个例子,这个例子里的函数double输入一个非负整数$n$,输出$2n$. \[ {double} ...
- 大到可以小说的Y组合子(二)
问:上一回,你在最后曾提到"抽象性不足",这话怎么说? 答:试想,如果现在需要实现一个其它的递归(比如:Fibonacci),就必须把之前的模式从头套一遍,然后通过fib_make ...
- Y组合子
Y组合子 Y组合子的用处 作者:王霄池链接:https://www.zhihu.com/question/21099081/answer/18830200来源:知乎著作权归作者所有.商业转载请联系作者 ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- 大到可以小说的Y组合子(三)
答:关于Fix的问题你fix了吗? 问:慢着,让我想想,上次留下个什么问题来着?是说我们有了一个求不动点的函数Fix,但Fix却是显式递归的,是吧? 答:有劳你还记的这个问题. 问:Fix的参与背离了 ...
- 面向组合子设计Coder
面向组合子 面向组合子(Combanitor-Oriented),是最近帮我打开新世界大门的一种pattern.缘起haskell,又见monad与ParseC,终于ajoo前辈的几篇文章. 自去年9 ...
- 大到可以小说的Y组合子(一)
问:上回乱扯淡了一通,这回该讲正题了吧. 答:OK. 先来列举一些我参考过,并从中受到启发的文章. (1.)老赵的一篇文章:使用Lambda表达式编写递归函数 (2.)装配脑袋的两篇文章:VS2008 ...
- 大到可以小说的Y组合子(零)
问:啊!我想要一个匿名的递归… 答:Y(音同Why)… … … 问:作为一位命令式语言的使用者,为什么会突然折腾起Y组合子呢? 答:的确,这事儿要从很久以前的几次搁浅开始说起…上学的时候,从来没有接触 ...
随机推荐
- sqlyog绿色破解版
http://pan.baidu.com/s/1mghyUrY 下载地址
- Photoshop CS6 基础知识
Photoshop CS6 基础知识 新建 练习 宽度72, 像素厘米 ...
- Marshal 类的内存操作的一般功能
Marshal类 提供了一个方法集,这些方法用于分配非托管内存.复制非托管内存块.将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法. 命名空间:System.Runtim ...
- Unix下C程序内存泄露检测工具:valgrind的安装使用
Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...
- Manifest merger failed : uses-sdk:minSdkVersion 9 cannot be smaller than version 10 declared in library
Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : uses-sdk: ...
- python中实现多线程的几种方式
python实现多线程的方式大概有 1.threading 2._thread #!/usr/bin/python #!coding:utf-8 import threading def action ...
- android支付宝支付开发过程
原文:android支付宝支付开发过程 支付宝开发流程: 1.在支付宝申请一个账号并开通开发者功能和移动支付的功能. 支付宝地址:https://auth.alipay.com/login/index ...
- DNS解析服务使用的系统对网站的安全起着很重要的作用
1 采用独享的DNS服务器解析系统 DNS解析服务使用的系统对网站的安全极其重要.现在国内的DNS服务器普遍是公用的,即是你的企业网站DNS解析服务和其他许多网站都是由同一个DNS服务器提供.一旦某个 ...
- 表格无边框,有内框,在table嵌套时,防止出现重复边线
<html> <head> <title>test 表格无边框,有内框! ^^ CSDN 学习积累</title> <style type=&qu ...
- list 、set 、map 粗浅性能对比分析
list .set .map 粗浅性能对比分析 不知道有多少同学和我一样,工作五年了还没有仔细看过list.set的源码,一直停留在老师教导的:"LinkedList插入性能比Array ...