Y Combinator

简介:

由于匿名函数(通常成为lambda函数但是跟lambda calculus不同)在递归时无法获得函数名,从而导致一些问题,而Y Combinator能很好地解决这个问题。利用不动点的原理,可以利用一般的函数来辅助得到匿名函数的递归形式,从而间接调用无法表达的真正的匿名函数。下面以一个阶乘的递归来说明。

#Python版本,后面会加上C++版本
#F(f) = f
def F(f,n):
    return 1 if n==0 else n*f(n-1)
#或者用lambda
#F = lambda f,n: 1 if n==0 else n*f(n-1)
#Y不能用lambda,因为Y会调用自己

#Y(F) = f = F(f) = F(Y(F))
def Y(F):
    return lambda n: F(Y(F),n)
a = Y(F)
# 6
print a(3)

一些解释:

  • F是伪递归函数,将真正的我们假设的匿名函数作为参数,有性质
    F(f)=f.
  • 好了以上是我们的已知条件,为了得到f的间接表达式,我们引入Y函数
    使得Y(F) = f
  • 所以有Y(F) = f = F(f) = F(Y(F)) (最终的目标是要用YF的组合表示f),所以很容易就得到了Y(F)的函数表达式为F(Y(F)),而Y不是匿名函数,所以能自身调用(其实感觉这东西没想象中那么玄乎~),上面的代码也就比较好理解了。我们假设的函数只有一个额外参数n,这完全可以自己添加其他参数,只需稍微修改Y中F的调用。

最后附上一段C++的实现代码:

//需要C++11支持
#include <iostream>
#include <functional>
//F(f) = f
int 
F(std::function<int(int)> f, int n)
{
    return n==0 ? 1 : n*f(n-1);
}
//或者
//auto F1 = [](std::function<int(int)> f, int n) {
//    return n==0 ? 1 : n*f(n-1);
//};


//Y(F) = f = F(f) = F(Y(F))
std::function<int(int)>
Y(std::function<int(std::function<int(int)>,int)> F)
{
    return std::bind(F, std::bind(Y,F), std::placeholders::_1);
}

int main(int argc, char *argv[])
{
    auto f = Y(F);
    std::cout << f(3) << std::endl; //6
    return 0;
}
相关文章
|
2月前
|
缓存 分布式计算 Hadoop
HBase在高并发场景下的性能分析
HBase在高并发场景下的性能受到多方面因素的影响,包括数据模型设计、集群配置、读写策略及性能调优等。合理的设计和配置可以显著提高HBase在高并发环境下的性能。不过,需要注意的是,由于项目和业务需求的不同,性能优化并没有一劳永逸的解决方案,需要根据实际情况进行针对性的调整和优化。
99 8
|
小程序
微信小程序项目实例——体质计算器
微信小程序项目实例——体质计算器
|
存储 监控 机器人
UiPath简介
RPA(Robotic Process Automation)是软件机器人,是基于计算机操作系统的工作桌面,自动识别、完成预先设定的工作流程。 UiPath即RPA中的一种。
UiPath简介
|
存储 弹性计算 安全
阿里云2核4G服务器ECS规格清单及CPU性能详解
阿里云2核4G服务器ECS规格有共享型s6、计算型c6、计算型c7、计算型c8y、AMD计算型c7a、高主频计算型hfc7、ARM计算型c6r、安全增强计算型c7t、计算型c5和突发性能实例t6等等,阿里云百科分享阿里云服务器2核4G配置CPU性能参数表:
450 0
阿里云2核4G服务器ECS规格清单及CPU性能详解
|
弹性计算 小程序 测试技术
阿里云服务器免费申请1个月试用攻略
本文介绍阿里云服务器申请1个月试用的申请地址、典型试用案例、试用事项详细说明和云服务器免费试用热门问题等内容,让用户了解阿里云服务器试用的相关政策,并选择适合自己的试用套餐。
2906 0
阿里云服务器免费申请1个月试用攻略
POI写Word换行
POI写Word换行            本文旨在描述基于变量替换生成Word doc文件的换行方式。Word换行主要有两大类,一类是表格单元格文本的换行,另一类是表格之外的文本的换行。
1579 0
|
Python
Python字符串f-string使用大括号{}
Python字符串f-string使用大括号{}
658 0
|
Ubuntu Linux 开发者
阿里云镜像站全新上线镜像合集,速度收藏!(内含manjaro,gnu,openwrt等多个镜像资源)
应广大开发者的需求,阿里云镜像站官方近期新增了一大批镜像仓库,包括 Manjaro、GNU、Openwrt、KaOS、Chakra 等各大发行版以及其他小众镜像。下面为大家贴一下这些新增镜像的地址及详情页信息,需要的用户建议速度收藏哦!
7931 0
阿里云镜像站全新上线镜像合集,速度收藏!(内含manjaro,gnu,openwrt等多个镜像资源)
|
存储 SQL 搜索推荐
阿里云PostgreSQL精选案例 - 实时精准营销、人群圈选
标签 PostgreSQL , 阿里云 , 实时精准营销 , 人群圈选 , 广告 背景 行业: 几乎所有行业, 如互联网、新零售、教育、游戏等. 应用场景: 根据目标群体的特征, 快速提取目标群体.
2831 0
阿里云PostgreSQL精选案例 - 实时精准营销、人群圈选
|
Java 关系型数据库 MySQL
源码|详解分布式事务之 Seata-Client 原理及流程
本文主要基于 spring cloud + spring jpa + spring cloud alibaba fescar + mysql + seata 的结构,搭建一个分布式系统的 demo,通过 seata 的 debug 日志和源代码,从 client 端(RM、TM)的角度分析其工作流程及原理。
8174 9