首页 > 代码库 > 多项式相加——C++和racket
多项式相加——C++和racket
多项式相加是一个简单到爆的算法练习,学习链表之后一般会波拉波拉讨论稀疏的、稠密的用什么来表示,最后一般都作为链表的练习题出现。其实用数组表示多项式显然是不合理的,大多数的多项式必然没有如此紧密,链表几乎是唯一的选择。
放在C++这样的语言中,直接构建一个poly结点类,然后构建一个poly类(包含一个头节点),基本就是一个单链表的实现,对于多项式的加法,和有序链表的连接比较像,乘法就更简单了,逐一乘过去就行了。
导致这个过程很简单的原因是类的封装(C 用结构体加一些函数对于这个简单的问题也基本没区别), 当然其实一个map也可以模拟这个结构。
当我们选用racket来实现的时候问题就有意思的多了,并且,所有的层次结构都要自己来封装实现,大概过程是:从多项式的结点term的构造,到多项式链表terms,最后将terms和一个变量 ( 例如x ) cons到一起,每一步都要做好封装,多说无益,这是一个值得动手的项目,重要的不是多项式本身,而是从中体会封装和抽象的技巧和含义。
在racket这样的语言中,语法极为简单的情况下可以构造出异常复杂的数据结构和函数,从而有极强的表达力,当然也需要设计者的抽象封装技巧,不然代码量稍微大一点就已经bug百出不能看了。
代码这里就不贴了,SICP 第二章末尾有此例,并且还有有理数系统、符号求导等其它几个例子,均是理解闭包性质和数据抽象的好例子,强烈推荐。
(如果没有学过scheme,直接从SICP开始就非常好,因为它只会给你一点点语法让你去创造复杂结构,只有万不得已的时候才会继续给你介绍语法,讲解过程中语法是为了思想而服务的,因此完全没有必要先去扣scheme的语法再来看)
多项式相加——C++和racket