数学基础差加之受严重的功利主义思想的影响,我对数学一直是没有太大兴趣。不过最近一段时间在看《算法导论》和《SICP》,几周下来发现进度之慢,归结原因是大部分数学知识都被我遗弃了,然后看的时候不得不在案头放上离散数学、微积分、线性代数、统计学、运筹学等大学未弃之书作为速查手册,说能快起来那是在自我忽悠。
做程序不能不懂数学犹如绘画不能不懂素描,基本功扎实了才好发挥。但鉴于程序员与数学家还是有本质的不同,不但要保持思维跨度在1到pow(10,15)也就是15个数量级之间还要学习相应业务知识以及应对客户,有点爱好的还要研究下声乐,绘画。这种情况下大可不必去与数学较劲。所以开发人员在数学的学习上最好是贯彻‘广度优先’这一方针,将要应对的问题和与之对应的数学知识在头脑中建立一张dynamic lookup table即可,待到用的时候在去查阅相关资料。即便不知道具体公式,但若能在求最大公约数的时候立马想到欧老前辈,也就算基本合格了。但话说回来,像这种基础的还是记住的好,不然不好意思跟人家说I'm very professional!
废话一大堆,最近才看到SICP的第三章,前面有一些习题也没有来得及做,昨夜在回顾习题的时候碰上了exercise2.6,关于lambda算子中数的表示,这套形式系统中,酷就酷在可以全由lambda演算系统中的合法符号来表示数,通俗的说就是用没有一个数字的表达式来表达数字
SICP中的一个例子
看看数学中0(zero )是如何用lambda表达式来定义的:
(define zero (lambda(f)(lambda(z) z)))
对于Alonzo Church来说,看上面的代码好比看英语,但对于在数学之海的岸口张望的人来说,不太直观
那再看看one two three
(define one (lambda(f)(lambda(z)(f z))))
(define two (lambda(f)(lambda(z)(f (f z)))))
(define three (lambda(f)(lambda(z)(f (f (f z))))))
似曾相识?那看下面
int zero=0;
int one=zero+1;
int two=one+1;
int three=two+1;
通过这样一对比,很容易就可以得出一个Chruch数与自然数的转化式
;做个过度
(define f (lambda(x)(+ x 1)))
(display (f (f 0)));output 2
;转换式
(define (cn-to-n cn)
((cn (lambda(x)(+ x 1)))0))
数的表达有了,接下来就是运算了,习题的要求是做了加法运算
(define (add x y)(+ x y))
一个很典型的加法,但不适用于Chruch数
要支持Chruch数的运算,那至少要在运算式中将其表达出来吧。
从前面的定义来看,lambda(f)(lambda(z)..)是跑不了的,由于Chruch数本身即是嵌套的函数表达式,那只要我能将最后的结果组合成(f (f (f ..(f z)..)))这番模样就算大功告成了
这个时候再琢磨一下前面的Chruch数,然后换个写法
(define one (lambda(f)(lambda(z)(f ((zero f)z)))))
(define two (lambda(f)(lambda(z)(f ((one f)z)))))
(define three (lambda(f)(lambda(z)(f ((two f)z)))))
在Chruch表达式里面(one f)就是one,(two f)就是two,从而推出(x f)=x,再考虑到函数的叠加,试着定义'5',
(define five (lambda(f)(lambda(z)((three f)((two f)z)))))
然后从特殊到一般,得出加法运算式
(define (add x y)
(lambda(f)(lambda(z)((x f)((y f) z)))))
习题是完成了,但凡是涉及到数学的问题都有让人去发散思维的魔力,加法都出来了,何不看看乘法,前面定义了五,现在试着定义下六
(define six (lambda(f)(lambda(z)((three (two f))z))))
;依葫芦画瓢得出乘法定义
(define (mul x y)
(lambda(f)(lambda(z)((x (y f))z))))
解题过程中为求天时地利,坚持坐北朝南,并发扬一贯的连蒙带猜,猜中带推的作风,虽终得正解,但仍不能掩饰数学知识之贫乏,恶补在所难免。
分享到:
相关推荐
本文主要介绍Spark中的基本转换算子及其应用场景。 #### 二、转换算子详解 1. **`map(func)`** - **功能**:`map(func)`算子会将RDD中的每一个元素传递给用户定义的函数`func`进行处理,并返回一个新的RDD。 - ...
Harris算子的核心思想是通过计算图像中每个像素点的周围像素的灰度变化来检测角点。它使用一个2x2的差分矩阵M来描述局部灰度变化: \[ M = \begin{bmatrix} I_x^2 & I_xI_y \\ I_yI_x & I_y^2 \end{bmatrix} \] ...
### 线性微分方程的微分算子级数解法 #### 一、引言 在解决线性微分方程问题时,传统的解法往往依赖于特定的数学技巧或者数值方法,而微分算子级数法提供了一种新颖且直观的方法来求解这类方程。这种方法的核心...
总的来说,OpenCV中的Snake算子通过`cvSnakeImage`函数提供了便捷的方式来提取和追踪图像中的轮廓。通过理解Snake模型的基本原理,以及如何在代码中正确调用和配置`cvSnakeImage`,开发者可以在各种计算机视觉任务中...
### 如何在 Spark 中使用算子来处理数据 在大数据处理领域,Apache Spark 作为一种高效且功能全面的数据处理引擎,其核心优势在于提供了一系列高级工具和技术来简化大规模数据集的操作。其中,Spark 算子...
然后,我们计算M的特征值(\( \lambda_1 \), \( \lambda_2 \))及其差分 \( R = \lambda_1 - \lambda_2 \) 和它们的乘积 \( \kappa = \lambda_1 \cdot \lambda_2 \)。\( R \) 表示局部边缘的强度,而 \( \kappa \) ...
4. **编程接口**:Tensor Engine 提供了丰富的编程接口,包括Tensor Engine 算子库、Lambda、Schedulendarray、ExternFlow、Platform (CCE)、Debug和Tuning Platform等,同时支持与第三方自定义算子的集成,并兼容...
通过理解Harris算子的工作原理和MATLAB实现,你不仅可以检测图像中的角点,还能进一步学习其他相关特征检测算法,如Shi-Tomasi(又称为Good Features to Track)算子,或者更现代的方法如SIFT(尺度不变特征变换)和...
这意味着,通过调整参数 \( \lambda \),可以得到方程的多个正实数解,这在实际应用中可能表示不同的物理或数学现象。例如,在生物种群模型中,这些正解可能代表不同稳定的物种密度状态。 文章特别指出,先前的研究...
Python实现中缀λ算子
该代码使用以下显式公式计算 Dirichlet、... 例如,计算具有混合边界条件的 3D 负拉普拉斯算子的所有内容: [lambda,V,A] = laplacian([100,45,55],{'DD''NN''P'},20); 仅计算特征值: lambda = laplacian
论文中,作者针对一类无界上三角算子矩阵,给出了它们的点谱和剩余谱的完整描述,这对于理解和分析这类矩阵的性质至关重要。 在论文中,作者还构造了若干个剩余谱非空的上三角算子矩阵实例。这些实例不仅验证了理论...
如果算子\(T \in B(H)\),其零空间\(N(T)\)的维数记为\(n(T) = \dim N(T)\),值域\(R(T)\)的余维数记为\(d(T) = \dim H / R(T)\)。 - **Fredholm算子**: 如果\(T \in B(H)\)使得\(R(T)\)闭合,并且\(n(T)\)和\(d(T)...
所得的角度可观测值以具有手性翻转算子的标准模型和新物理模型中涉及强子形状因子的螺旋振幅表示。 我们使用有效的理论来确定所涉及的强子形因子之间的关系,从而研究了低和大后坐力时的这些可观察性。 由于目前尚...
文章中还提到了相关的数学符号和性质,如\( \lambda I - Q \)的形式,在各种空间上算子的表达式和性质都被详细地研究和证明。这些性质的证明,涉及了对相关函数和算子进行分析和推导,确立了算子在各自空间上的特定...
### 广义C0半群与耗散算子的关键知识点 #### 1. 广义C0半群的定义与性质 广义C0半群是C0半群的一个扩展概念,它允许在某些条件下...通过对这些概念和定理的深入探讨,我们可以更好地理解和解决实际问题中的数学模型。
4. **Harris算子**:应用Harris算子计算响应矩阵R的特征值 \( \lambda_1 \) 和 \( \lambda_2 \),以及它们的乘积 \( \lambda_1\lambda_2 \)。Harris算子定义为: \[ E = \lambda_1\lambda_2 - k(\lambda_1 + \...
在探讨无限Lambda项之前,我们先简要回顾一下Lambda演算的基础知识及其在计算机科学中的应用背景。 **Lambda演算**是一种形式化的计算模型,由Alonzo Church在20世纪30年代提出,它是函数式编程语言理论基础的核心...