zoukankan      html  css  js  c++  java
  • 多项式相加——C++和racket

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

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

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

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

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

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

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

  • 相关阅读:
    HTML5 重力感应效果,实现摇一摇效果
    WEB 移动端 CSS3动画性能 优化
    jquery 插件封装模板
    textarea 提交到数据库的内容,输出到 html 中显示正常的格式
    js根据银行卡号判断属于哪个银行,并返回银行缩写及银行卡类型
    微信小程序如何引用iconfont图标
    nodejs: express basic
    javascript设计模式:适配器模式
    javascript设计模式:装饰者模式
    javascript设计模式:代理模式
  • 原文地址:https://www.cnblogs.com/gaoduan/p/3987368.html
Copyright © 2011-2022 走看看