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

  • 相关阅读:
    C# 函数参数object sender, EventArgs e
    Winform中利用委托实现窗体之间的传值
    Web前端学习笔记——Canvas
    js 删除 按钮所在的行
    box-sizing
    前端中关于HTML标签的属性for的理解
    apply和call的用法总结
    target 确定元素是谁??
    css3过渡和动画
    处理两端极限值的小技巧
  • 原文地址:https://www.cnblogs.com/gaoduan/p/3987368.html
Copyright © 2011-2022 走看看