- 1、本文档共19页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
信息科学系低年级讨论班
信息科学系
低年级讨论班
(4 )
裘宗燕
北京大学数学学院信息科学系
2010年3月~6月
本科生讨论班报告(1) 北京大学数学学院信息科学系 裘宗燕 2010年2月18 日/1
为“The Book”写程序
《代码之美》第33章
本科生讨论班报告(1) 北京大学数学学院信息科学系 裘宗燕 2010年2月18 日/2
“The Book”
Paul Erdos (例如:/group/topic/3017467/)
常说到“The Book” (或许可称为“天书”),里面包含着所有数学定理
的最优证明(Paul Erdos,一位与许多人合作的当代数学家)
本文作者提出“应该”也有一本算法和程序的“The Book”,里面包含所
有可计算问题的最优解决方案(及实现算法的最优程序)
作者的问题:我们能不能为这本书写一个程序?
也就是说,针对一个问题写出一个不仅无懈可击,而且每个读者都只
能赞不绝口、高山仰止的程序
人都希望自己能创造出这样的算法艺术瑰宝,但
程序里常会有些瑕疵,有不如意之处
即使正确,也常有勉强和不自然之处、结构脆弱之处、逻辑较混乱的
特殊情况和例外情况
在这些方面努力,可能突然获得灵感,或通过别人工作的启发,得到一
个绝妙的可以写入“The Book”的程序
本科生讨论班报告(1) 北京大学数学学院信息科学系 裘宗燕 2010年2月18 日/3
本文的问题
作者讲了自己的一个故事:不断追求最终写出了一个好程序
问题领域:计算几何。这里的情况和特点:
许多问题看似容易,深入之后会发现很麻烦
计算集合中的算法不是以象素为单位(不像图形学),而是理想化
的(像尺规作图):点无大小,线宽为0,圆是精确的,等等
必须得到精确结果,一点不精确都可能改变整个计算的性质。例如
小数点后最低位的数字也可能逆转结果的性质
欧几里得说:几何无捷径。现在还加上效率。这里主要关心美学
问题:写一个函数,判断平面三点是否共线
似乎很简单,有许多数学上正确的方法
肯定有许多人做过
可以找别人的做法,但作者是自己考虑
本科生讨论班报告(1) 北京大学数学学院信息科学系 裘宗燕 2010年2月18 日/4
Lisp
下面要给出函数的几个版本,都是用Lisp 写的
例:求最大公约数的欧几里得算法
(defun gcd (a b)
(if (= b 0)
a
(gcd b (mod a b))))
这个程序肯定在“The Book”里面
Lisp 采用括号括起的前缀表达式,括号里
第一个表达式表示操作,后面是操作对象
defun 定义函数,随后是函数名,参数表和函数体
if 是条件表达式,后面三项分别是条件和两个分支
本科生讨论班报告(1) 北京大学数学学院信息科学系 裘宗燕 2010年2月18 日/5
朴素算法(第一试)
用纸和笔计算(若目测不能确定):
在纸上画出三个点
过两点画直线,看第三个点是否在线上
计算机上也可以这样做
需要选两个点画直线,怎样选择最好?为什么?
请大家讨论
假设直线方程为y = mx + b ,假定三个点是p, q, r,用两点算方程,用
第三点坐标判断是否在线上,函数定义如下:
(def
文档评论(0)