• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

多项式相加——C++和racket

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

多项式相加是一个简单到爆的算法练习,学习链表之后一般会波拉波拉讨论稀疏的、稠密的用什么来表示,最后一般都作为链表的练习题出现。其实用数组表示多项式显然是不合理的,大多数的多项式必然没有如此紧密,链表几乎是唯一的选择。

放在C++这样的语言中,直接构建一个poly结点类,然后构建一个poly类(包含一个头节点),基本就是一个单链表的实现,对于多项式的加法,和有序链表的连接比较像,乘法就更简单了,逐一乘过去就行了。

导致这个过程很简单的原因是类的封装(C 用结构体加一些函数对于这个简单的问题也基本没区别), 当然其实一个map也可以模拟这个结构。

当我们选用racket来实现的时候问题就有意思的多了,并且,所有的层次结构都要自己来封装实现,大概过程是:从多项式的结点term的构造,到多项式链表terms,最后将terms和一个变量 ( 例如x ) cons到一起,每一步都要做好封装,多说无益,这是一个值得动手的项目,重要的不是多项式本身,而是从中体会封装和抽象的技巧和含义。

在racket这样的语言中,语法极为简单的情况下可以构造出异常复杂的数据结构和函数,从而有极强的表达力,当然也需要设计者的抽象封装技巧,不然代码量稍微大一点就已经bug百出不能看了。

代码这里就不贴了,SICP 第二章末尾有此例,并且还有有理数系统、符号求导等其它几个例子,均是理解闭包性质和数据抽象的好例子,强烈推荐。

(如果没有学过scheme,直接从SICP开始就非常好,因为它只会给你一点点语法让你去创造复杂结构,只有万不得已的时候才会继续给你介绍语法,讲解过程中语法是为了思想而服务的,因此完全没有必要先去扣scheme的语法再来看)


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#拖放操作获得文件名发布时间:2022-07-14
下一篇:
C#LINQ发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap