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的语法再来看)

  • 相关阅读:
    yii required 字段去除*号
    shtml用include加载文件,apache开启SSI,及shtml压缩
    门户站点用html或shtml文件格式的原因
    Apache配置shtml
    数据库迁移工具
    SQL SERVER2005 级联删除
    MySql级联删除和更新
    js只允许输入数字和小数点
    表格中的数据为空时,td的边框不显示
    MYSQL: Cannot delete or update a parent row: a foreign key constraint fails
  • 原文地址:https://www.cnblogs.com/gaoduan/p/3987368.html
Copyright © 2011-2022 走看看