SICP中丘奇计数的理解

数字有意义吗?如果有意义他的意义是什么?
从原始时期的时候人们就开始对数有了认识.
放羊的表示我养的一只羊可以代表数字1
烙饼的表示我做的一张饼可以代表数字1
计算机科学家表示我写的函数被调用一次可以表示数字1
我们就用这个概念来表示一下数字.来体会一下万物皆是函数的概念.
首先规定参数可以是任意类型
我们首先对0这个数字进行定义
(define  (zero f) (lambda (x) x))

参数 f 是函数,但他没有被调用.这就是我们的0的概念他返回的匿名函数用来表示已经为0

我们首先应该确定被调用函数的格式

(define (f x) (display "x"))

每次这个函数被调用,都会打印出"x".

之后我们可以来表示1

(define (one f) (lambda(x) (f x)))

可以看到f被调用了一次, x作为f的参数.

我们来表示2

(define (two f) (lambda(x) (f (f x))))

用((two f) 0)来执行

函数返回了一个lambda表达式(lambda(x) (f (f x)))

他接受一个参数.然后再去调用函数

我们给他一个0.其实给他别的东西也可以.

之后函数变成(f (f 0))

函数f接受到了一个参数.但这个参数也是个函数

因此外面的f并没有被执行.参数里面的函数接受到了一个0不是函数.

因此可以执行 (display "x")

之后外面的函数被执行(display "x")

可知display被调用两次.我们的2的概念被表示出来了

效果就是屏幕上显示了两个x

也可以表示为

(define (two f) (lambda(x) (f ((one f)x))))

就是先执行one 之后在执行一次f .1+1也就是2的概念了

由此我们可以来表示加法的概念

(define (add num1 num2) (lambda(f) (lambda(x) ((num1 f) ((num2 f) x)))))

我们可以利用上面的one 和two结合加法来表示three(3)

(define three (add one two))

等价于

(define (three f) (lambda(x) ((one f)((two f) x)))))

首先(one f)会返回一个(lambda(x)(f x))然后((num2 f) x)作为参数传入

因为参数是个函数首先被计算((num2 f) x)结果就是输出两个x

然后执行(f x)输出一个 x

乘法就可以表示为

(define (mul num1 num2) (lambda(f) (lambda(x) ((num1 (num2 f))x))))

对num2 f进行num1次调用 不就是我们的乘法的概念吗?

时间: 2024-10-23 19:35:38

SICP中丘奇计数的理解的相关文章

网站并发数的理解

想要探讨这个概念,源于某个攻击事件.某个应用平台遭到外部攻击,导致apache连接数冲高,平台使用缓慢.通过日志分析平台来看,从平台遭遇攻击起,apache请求数在不断下降,与之前的认知有所不同. 之前认为apache请求数在遭遇攻击时,应该不断增加才是.实则这个请求数可以理解为并发数,就引出"网站并发数"的概念. 对于网站服务器而言,网站并发数,可以理解为,在单位时间内,服务器能够同时处理的最大请求数.由于请求业务的不同,有的请求1秒内结束,有的请求10秒内结束.因此,网站并发并不是

光耦的參数的理解

光耦能否够近似看做成一个带隔离功能的三级管呢? 槽型光耦也被project技术人员称作槽型光电开关或者对射式光电开关,也是以光为媒体,由发光体与受光体间的光路遮挡或由反射光的光亮变化为信号,检測物体的位置.有无等的装置.槽型光耦也是由一个红外线发射管与一个红外线接收管组合而成.它与接近开关相同是无接触式的,受检測体的制约少,且检測距离长,应用广泛. 1 引言 光耦作为一个隔离器件已经得到广泛应用,无处不在.一般大家在初次接触到光耦时往往感到无从下手,不知设计对与错,随着遇到越来越多的问题,才会慢

熟读高数才能理解机器学习?不,初中数学就够了

导读 谁说理解机器学习必须要熟读高数? 近日,数据科学Kyle在Medium发布博客表示,理解机器学习在做的事情,有初中数学知识足矣. 这篇博客简洁易懂.幽默风趣,在Medium上几天内获得600多赞.量子位将文章翻译整理如下,与大家分享: 当下理解我们人工智能的方式通常比较极端,要么通过媒体,越来越耸人听闻的观点让人难以想象.要么通过文献,充满晦涩语言和特定术语的论文让人难以理解. 理解AI的正确姿势应该在两个极端之间,这就需要你在新闻或文献之外理性判断,对于一般人来说,至少应该知道AI是什么

对卡塔兰数的理解

卡塔兰数定义 f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0)       = f(k-1)f(n-k) k=1...n 以k为轴划分子问题,左边子问题的解的个数和右边子问题的解的个数是原问题以k为轴的解法的2个独立步骤,适用乘法原理 分别以1,2,...n为轴,是原问题的n种解法,适用加法原理. 与卡塔兰数有关问题通常满足如下描述:有一个大问题A,规模为n,要解决这个问题,可以用分治的思想,首先固定其中某一个元素,将剩下的n-1个元素拆分成两个

JavaScript----函数深入理解

首先,JavaScript所有的函数都可以看成是Function对象的实例. 一.创建函数的方法 1.函数声明的方法 function sayHi(){ alert("hi,tuan"); } 2.函数表达式的方法 var sayHi=function(){ alert(“hi,tuan"); } 区别:JavaScript中的函数声明提升,会使得,浏览器先解析函数声明,而函数表达式的方法中只有在浏览器读到这一行,函数才能被创建. 二.函数的参数 对于JavaScript来说

SICP 习题 (2.7) 解题总结 : 定义区间数据结构

SICP 习题 2.7 开始属于扩展练习,可以考虑不做,对后面的学习没什么影响.不过,如果上面的使用过程表示序对,还有丘奇计数你都可以理解的话,完成这些扩展练习其实没什么问题. 习题2.7是要求我们协助Allysa完成interval的定义. Allysa定义了下面的过程来创建一个区间(interval),其中a是起点(就是较小的部分),而b是终点(就是较大部分). (define (make-interval a b) (cons a b)) 题目要求我们实现lower-bound过程和upp

SICP 习题 (2.6) 解题总结

SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续. 这里大师们想提醒我们思考的是"数"到底是什么,在计算机系统里可以如何实现"数",准备好开始脑洞大开吧: 题目先讲到下面的定义,首先是0的定义: (define zero (lambda (f) (lambda (x) x))) 然后是操作+ 1的定义: (define (add-1 n) (lambda (f) (lambda (x) (f ((n f) x))))) 接着题目就要求我们根据以

SICP 习题 (2.6) 解题总结:丘奇计数

SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续. 这里大师们想提醒我们思考的是"数"究竟是什么,在计算机系统里能够怎样实现"数".准备好開始脑洞大开吧: 题目先讲到以下的定义,首先是0的定义: (define zero (lambda (f) (lambda (x) x))) 然后是操作+ 1的定义: (define (add-1 n) (lambda (f) (lambda (x) (f ((n f) x))))) 接着题目就要求我们依据以

897B. Chtholly's request#长度为偶数的回文数(模拟)

题目出处:http://codeforces.com/problemset/problem/897/B 题目大意:构造一个题意要求的zcy数之后取模 #include<iostream> using namespace std; int main(){ int n,m; __int64 g,t,sum=0; cin>>n>>m; //关键在于zcy数的构造 //注意到要求长度是偶数 //考虑回文构造 for(int i=1;i<=n;i++){ g=i; t=i;