文档章节

如何用函数表示数(五)其他运算

ueharaai
 ueharaai
发布于 2013/07/17 22:24
字数 941
阅读 49
收藏 0
点赞 0
评论 0

有了增1和0,我们就可以表示出所有的数了。事实上,这种用函数计数的方法叫做church numeral,发明者是阿隆佐.邱奇,听说过此名字的人可能不多,此人发明了lambda算子,为图灵的导师,奠定了现代计算机理论基础的图灵机正是lambda运算的一种表现方式。因此此人可以被称为咱们程序员的祖师爷,也不为过。

除了增1之外,该计数法还有其他的运算方式,下面一一进行陈列和解说。

加法


function add(n){
  return function(m){
    return function(f){
      return function(x){
          return n(f)(m(f)(x));
      }
    }
  }
} printduck(add(two)(three));
别晕,拆开来看就能看得清楚。

加法虽然嵌套了四层,这是因为加法是双目运算,除了表现出加法结果的f和x之外,还有两个被加数要加进来:

function add(n){
  return function(m){
    return function(f){
      return function(x){
          part1 = m(f)(x);//execute f(x) m times;
          return n(f)(part1);//execute f(x) n times,so tolally m+n tiimes;
      }
    }
  }
}

前面说过,形如n(f)(x)表示把f(x)执行n次。那么m(f)(x),表示执行m次f(x),n(f)(m(f)(x)),表示执行m+n次f(x),其结果就是表示出了m+n。此外,m和n中任意一个为0,都不会影响到另一半得出结果。

乘法


function multi(n){
  return function(m){
    return function(f){
      return function(x){
         return n(m(f))(x);  
      }
    }
  }
}

printduck(multi(two)(three));
弄懂了前面的加法,相信乘法是很好懂的。n(m(f))(x)表示把m(f)(x)执行n次,而m(f)(x)又表示表示把f(x)执行m次,因此等于执行m x n次f(x),乘法得以表示。此外n和m中有任何一个为zero都会让最终结果变为0.


真正销魂的是

指数算法:

function exp(m){//m^n
  return function(n){
    return function(f){
      return function(x){
        return n(m)(f)(x);
      }
    }
  }
} 
printduck(exp(three)(two));


相信看得懂的人不多,我努力做些解释看能不能帮助大家理解.


当n等于zero时,该式等于zero(m)(f)(x),根据zero的定义,zero(m)(f)=f.该试等于f(x)。因此不论m等于几,f(x)一定只被执行一次,相当于0的任意次方都等于1.

当n为大于0的数时,n(m)(f)(x) 相当于incr(n-1)(m)(f)(x)
再套用incr公式得到m(n-1(m)(f))(x)
正好可以套用前面的乘法公式n(m(f))(x),相当于把f(x)执行m*(n-1(m))次
而n-1(m)又可以转化为m*(n-2(m))
经过n次转换后,最终得到m*m*m……*m*(zero(m)),前面已经证明zero(m)=1
因此n(m)(f)(x)等于执行f(x)m的n次方次,得证。


思考&后记:

本篇文章只是展示了函数式编程方法的冰山一角,希望你看完这篇文章后可以体会到函数式本身的灵活和强大,而不仅仅是找到了一种新奇好玩的表示数的方法。留下几个问题给大家思考:

  1. 可不可以设计一个函数叫repeat(n,f)或repeat(n),它不仅能够重复执行一个任务n遍,还能够像上面的函数一样本身也具备叠加等数的性质?比如repeat(n,repeat(n,repeat(n,...)))。
  2. 在示例中用到的f和x两个函数,它们都具备入参x,入参x能否省略,为什么?
  3. 前文中提到n(f)(x)中,x从来不被执行。因此,在x处传入任何东西都是可以的。这句话是对还是不对?为什么?






© 著作权归作者所有

共有 人打赏支持
ueharaai
粉丝 42
博文 19
码字总数 18134
作品 0
徐汇
技术主管
Python运算符

一、基本概念 1、Python语言支持的运算符类型   算数运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符、运算符优先级 2、计算顺序     运算符优先级表决...

bxst ⋅ 2017/07/13 ⋅ 0

Python基础手册9——数字类型

Number(数字) Python的数字由字面值生成或者由算术操作符和内建的算术函数作为结果返回。数字提供了标量贮存和直接访问,它是不可更改类型,也就是说变更数字的值会生成新的对象。Python数...

常大鹏 ⋅ 01/09 ⋅ 0

JavaScript基础(三)运算符和数据类型转换

JavaScript运算符 一、运算符和操作数的组合就称为表达式。 二、javascript运算符 (一) 算术运算符 + - * / % var++ ++var var-- --var A. + (1) 用于数值的运算 (2) 用于字符串的连接 *** ...

曾杨 ⋅ 2013/12/26 ⋅ 1

五、MySQL函数

函数表示对输入参数值返回一个具有特定关系的值MySQL提供大量丰富的函数在进行数据库管理以及数据的查询和操作时将会经常用到各种函数。通过对数据的处理数据库功能可以变得更加强大更加灵活...

运维菜鸟丶 ⋅ 2017/08/01 ⋅ 0

C语言 类型转换

unsigned char c1 = 255, c2 = 2;int n = c1 + c2; 精度是N的有符号整数类型应该用N个Bit表示,取值范围至少应该覆盖(-2N-1, 2N-1)。我们用()括号表示开区间,不包含端点,用[]括号表示闭区间...

rgds ⋅ 2015/08/11 ⋅ 0

ARM处理器CPSR标志位和条件符之间的关系

本文目的是要理清ARM处理器的CPSR状态标志和ARM指令的条件符之间的关系。 一、CPSR寄存器 ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配如下图1所示。 图1 程序状态寄存器格式 状态...

LiSteven ⋅ 2013/08/26 ⋅ 0

python浓缩(5)数字

详细介绍每一种数字类型,适用的各种运算符, 及用于处理数字的内建函数。 5.1 数字类型 数字提供了标量贮存和直接访问。它是不可更改类型,也就是说变更数字的值会生成新的对象。 Python 支持...

人生如梦19 ⋅ 2016/04/11 ⋅ 0

js typoeof用法

typeof 返回字符串,有六种可能:"number"、"string"、"boolean"、"object"、"function"、"undefined"。 typeof是一个一元运算符,它返回的结果 始终是一个字符串,对不同的操作数,它返回不...

zdatbit ⋅ 2016/04/06 ⋅ 0

sass笔记-4|像写脚本一样写Sass,把能交给Sass办的都交给它

Sass笔记关于sass的基础部分已经写完,这一篇介绍Sass的高级特性——脚本特性。Sass能做很多事让样式表更智能,我们先会看到Sass眼中的数据类型,在这些数据类型上会有可进行的操作,此外,S...

Stinson_Zhao ⋅ 2016/12/06 ⋅ 0

有趣的二进制

优秀应用算法都大量用到位运算,而位运算在工作中很少用到,所以借助其算法,我们看一下位运算的优势以及应用,但是大多数教材只会教大家二进制和十进制如何互换,都是死记硬背式的,并没有去...

wier ⋅ 2017/11/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法之SlopOne

一、 算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分。如下图,估计UserB对ItemJ的偏好 图(1) 在真实情况下,该方法有如下几个...

xiaomin0322 ⋅ 30分钟前 ⋅ 0

LVM讲解

LVM是什么 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地...

李超小牛子 ⋅ 39分钟前 ⋅ 0

mysql更改密码、连接mysql、mysql常用命令

1. 更改mysql的root账户密码: mysql中root账户和系统root不是一个账户 1.1 更改环境变量PATH,增加mysql绝对路径 由于mysql安装目录为/usr/local/mysql/,所以系统不能直接使用mysql,需把/...

laoba ⋅ 40分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

猫耳m ⋅ 40分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云云栖社区 ⋅ 44分钟前 ⋅ 0

1.03-Maven中使用ueditor富文本编辑器

起因:在maven仓库未找到百度的ueditor的jar包 操作: 1.下载百度的ueditor的jar包 2.打开命令行,切换到ueditor的下载位置,运行一下命令: mvn install:install-file -Dfile=ueditor-1.1....

静以修身2025 ⋅ 49分钟前 ⋅ 0

几道Spring 面试题

1、BeanFactory 接口和 ApplicationContext 接口有什么区别? ApplicationContext 接口继承BeanFactory接口 Spring核心工厂是BeanFactory BeanFactory采取延迟加载,第一次getBean时才会初始...

职业搬砖20年 ⋅ 59分钟前 ⋅ 0

包饺子

http://storage.slide.news.sina.com.cn/slidenews/77_ori/2018_24/74766_826131_625489.gif

霜叶情 ⋅ 今天 ⋅ 0

xml解析

方法一: String s_xml1 = "<xml>" + "<head>lalalalal</head>" + "<body>1234</body>" + "</xml>"; try { DocumentBuilderFactory documentBuilderFactory......

GithubXD ⋅ 今天 ⋅ 0

reuse stream

Although Java streams were designed to be operated only once, programmers still ask how to reuse a stream. From a simple web search, we can find many posts with this same issue ......

idoz ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部