《编程原本》学习笔记( 二 )

        函数是算法的最小单元,是程序的基础。无论是采用面向对象的编程方法,还是采用面向过程的编程方法,都是如此。如果以函数为核心来解读和学习《编程原本》可能会相对容易些。 

       在PASCAL语言中把过程(procedure)和函数(function)两个概念分开,其根据是看相关的逻辑块是否有返回值;而C/C++则对函数和过程并没有作概念上的区分,而只是把PASCAL中的过程概念看作是返回值为void的函数。

       在《原本》中过程的概念与函数的概念是区分的。P6. 1.4 给出了过程的定义。P9. 给出的函数式过程( functional procedure )的概念,则明显地把函数定义为过程的一个子集。也就是说函数是过程的一种特殊情况,是一种带有返回值的过程。

       “谓词” 是数理逻辑中的概念,在学习《离散数学》时必会讨论到。谓词是一种表示命题的方式。由于数理逻辑主要研究命题间的逻辑关系,所以要先有一种方法对命题进行抽象,而谓词就是一种很好的方法。谓词可看作一个剥离了具体对象的函数,客体就是一个变量,谓词与客体结合起来就表示一个具体的命题。同时与n个客体结合的谓词就称为n元谓词。(n >=1 )

       《原本》借用了谓词的概念来表达程序中的一类特殊的函数---返回真值的函数。 也就是说,如果程序中有某个函数返回值类型是bool. 那么在《原本》里,就把它称之为(或者说定义为)谓词。( P15) ( 命题表达的就是真与假,所以用谓词来表达这类函数,使以后的研究全都建立在了坚实的数学基础上了。)


         需要说明的是,《原本》在研究程序时,会提出并定义一系列自已的概念,作为研究的对象和出发点。而对这些概念的定义也做了形式化的要求。也就是说如果《原本》要定义一个自已的概念,就必须要按照一定的格式来表达。就好象事先画好一张表格,作为定义概念用的。如果提出一个自已的概念,只要逐项地按要求添写相应内容就可以了。这张“ 表格 ”的样子就在P12中给出。( 当然,这是一张动态表格,组成表格的各项可根据实际需要来选定。 )

         举个例子:前面所说的谓词的概念在P15中给出。

         Predicate(P)  表示要定义一个谓词P.

         FunctionalProcedure(P) 表示所定义的谓词P是一个函数过程。(见上面的讨论,也就是说P是一个带返回值的过程。)

         Codomain(P) = bool  表示谓词P的返回值类型是一个bool型。 

        而两者之间的符号" ^ " 则表示此定义要同时满足这两个条件。

        关于Domain 和 Codomain的含义可以参看" 学习笔记( 三 ) "的说明。



      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编程原本》提供了有关编程的一种与众不同的理解。其主旨是,实际的编程也应像其他科学和工程领域一样基于坚实的数学基础。本书展示了在实际编程语言(如C++)中实现的算法如何在最一般的数学背景中操作。例如,如何定义快速求幂算法,使之能使用任何可交换运算。使用抽象算法将能得到更高效、可靠、安全和经济的软件。 这不是一本很容易读的书,它也不是能提升你的编程技能的秘诀和技巧汇编。本书的价值是更根本性的,其终极目标是提升你对编程的洞察力。要想从中大获裨益,你需要从头到尾认真学习:阅读代码,证明引理,完成练习。到结束之时,你将看到如何把这里讨论的演绎方法应用到你的程序中,保证你做出的软件部件能一起工作,并表现出它们所应该表现的行为。 书中给出的算法和需求针对某些被操作的类型。有关这些描述的代码(也可以通过Web得到)采用C++的一个小子集书写,这样做是为了让所有有经验的程序员都能理解。这个小子集可以看做一种特殊语言,是由Sean Parent和Bjarne Stroustrup一起设计的。 无论你是一位软件开发者,还是其他以编程作为一项重要活动的专业人员,或者是一名在校的学生,你都会逐渐理解本书的经验丰富的作者多年来一直在教授和阐释的道理:数学对于编程是绝好的东西,理论对于实际是绝好的东西。
本书将演绎方法应用于程序设计,讨论程序与保证它们能正确工作的抽象数学理论之间的联系。书中把理论的规程、基于这些理论写出的算法,以及描述算法性质的引理和定理一起呈现给读者。 第1章 基础 1 1.1 理念范畴:实体,类别,类属 1 1.2 值 2 1.3 对象 4 1.4 过程 6 1.5 规范类型 7 1.6 规范过程 8 1.7 概念 10 1.8 总结 14 第2章 变换及其轨道 15 2.1 变换 15 2.2 轨道 18 2.3 碰撞点 21 2.4 轨道规模的度量 27 2.5 动作 28 2.6 总结 29 第3章 可结合运算 31 3.1 可结合性 31 3.2 计算乘幂 32 3.3 程序变换 35 3.4 处理特殊情况的过程 40 3.5 参数化算法 43 3.6 线性递归 44 3.7 累积过程 47 3.8 总结 48 第4章 线性序 49 4.1 关系的分类 49 4.2 全序和弱序 51 4.3 按序选取 52 4.4 自然全序 62 4.5 派生过程组 63 4.6 按序选取过程的扩展 63 4.7 总结 64 第5章 有序代数结构 65 5.1 基本代数结构 65 5.2 有序代数结构 70 5.3 求余 72 5.4 最大公因子 76 5.5 广义gcd 79 5.6 Steingcd 81 5.7 商 82 5.8 负量的商和余数 84 5.9 概念及其模型 87 5.10 计算机整数类型 88 5.11 结论 89 第6章 迭代器 91 6.1 可读性 91 6.2 迭代器 92 6.3 范围 94 6.4 可读范围 97 6.5 递增的范围 106 6.6 前向迭代器 108 6.7 索引迭代器 113 6.8 双向迭代器 114 6.9 随机访问迭代器 115 6.10 总结 117 第7章 坐标结构 119 7.1 叉坐标 119 7.2 双向叉坐标 123 7.3 坐标结构 129 7.4 同构,等价和有序 129 7.5 总结 137 第8章 后继可变的坐标 139 8.1 链接迭代器 139 8.2 链接重整 140 8.3 链接重整的应用 147 8.4 链接的叉坐标 151 8.5 结论 155 第9章 拷贝 157 9.1 可写性 157 9.2 基于位置的拷贝 159 9.3 基于谓词的拷贝 166 9.4 范围的交换 174 9.5 总结 178 第10章 重整 179 10.1 置换 179 10.2 重整 182 10.3 反转算法 184 10.4 轮换算法 188 10.5 算法选择 196 10.6 总结 200 第11章 划分和归并 201 11.1 划分 201 11.2 平衡的归约 207 11.3 归并 212 11.4 总结 218 第12章 复合对象 219 12.1 简单复合对象 219 12.2 动态序列 227 12.3 基础类型 233 12.4 总结 236 跋 237 附录 A 数学表示 241 附录B 程序设计语言 243 参考文献 253 索引 257

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值