标签:保留 第一篇 如何 附加项 count 时间 编程 解决 第一个
我曾试图开发一个可以解方程组的程序。付出不少努力后,最后放弃。
期间遇到了很多问题,在分享故事的同时,希望能给大家提个醒。??
如果您也在学习编程,不妨也简单实现一部分功能,摸清规律就不难,但对理解递归、 面向对象等概念有很大帮助。
本文是第一篇,我来讲述我实现“根号类”的过程。
高二时学圆锥曲线(就是椭圆、双曲线、抛物线那个),计算量特别大,做一道得算半天。
我当时正在啃 《流畅的python》 ,自以为技术不错,正好隔壁班一个练编程的同学找我讨论相关技术细节(如何因式分解),
我问他是不是想开发一个解方程组的程序,他说是——正好我也想。
于是和他一拍即合,一起开发。
当然我们都不是不知道有用于计算的程序以及模块,只是因此为契机,给自己找个练习的项目。
可能“ 初生牛犊不怕虎 ”说的就是我们这样的事。
我们先花了一中午时间,讨论让程序解方程需要开发哪些功能,再给这些待完成的功能排了开发顺序。
当时是这么想的:
计算机算无法直接解方程,是因为它会直接把数计算出来。
所以首先是要开发可以保留计算“半成品的”的类。
例如“根号”“待定系数”。
然后将总目标拆分成一个个小目标。
方程组由 方程 组成,方程由常数和 待定系数 组成,
常数中 分数 、 根号 是内置类型中没有的,也需要完成。其实python默认模块里有分数类,只是当时我不知道。
要先开发底层模块,也就是作未知数系数、方程常数的“ 根号 ”。
下一个应该是作为方程组成之一的“ 待定系数 ”,也就是x、y这样的数。
之后开发“ 分数 ”,避免把1 / 3算成0.333,同时它也支持分子、分母为根号和待定系数。
当时用的草稿纸,我还留着呢,哈哈哈。如图:
在我的计划里,开发顺序从下往上,从左到右;上级类兼容下级类,而下级类不必考虑上级。
如图:
有更多编程经验的诸位,可以看出我这个设计的巨大问题——模块间过于相互依赖。
这使得我在开发时反复修改下级模块,debug费时费力。为最后放弃埋下祸根。
我在和数学老师(他是计算机系毕业的)闲聊时,把写程序的事告诉了他。
他“呵呵”笑了两声,没说什么。
第一步是根号类。我把这个类的变量分为四个:“系数”“根底数”“附加项”(一个根号类列表 )和“常数”。
大至如此:
______ ______
系数 × ( √根底数1 + √根底数2 + ...) + 附加项 + 常数
我也打算像这样这样分两行显示,显示得很清楚吧。??
实例化根号类的第一步是处理提供的值 ,也就是“合并同类项”和“开根”。
合并的同类项如下所示:
开根如下所示:
把根号4等“整数”按整数处理。
我使用的开根的方法是:
先用穷举法分解质因数,再用collection.Counter统计结果,
之后用“根次”整除以每个数量,得数乘出去,余数保留。
这里插一句,我那个同学,他实现时用的说穷举法……让我嘲笑了一通。
python中没有直接操作多行文本的方法(如果你知道,请留言告诉我),
而我打算分两行显示文本,于是两行文本的协调就出现了问题。??
起初我想同时生成两行文本,但因为种种原因,最后总出错,比如多几个少几个空格。
当时我忙了至少两天,来解决问题……[捂脸]
这是我在纸上写的代码。这样的纸我写了好几张。
最后我是先生成第2行的内容,再迭代生成第一行(毕竟信息几乎都在第二行)。
再插一句,我那个同学,他实现时只用了一行显示,类似“√2”。
还有我得到的一些经验:
可以创建一个“中间方法”(或者叫接口),返回“半成品”结果,用于迭代时调用。
这样可以避免方法过长,方便实现和后期阅读。(我记得这时“设计模式”的一种)
第一步是求和,
因为已经有处理提供的值的方法,只要把加数和类本身“打包”,交给生成新类就可以了。
第二步是取负,第三步是做差,都很简单。
最后是乘法,
根号数之间相乘,需要每个元素两两相乘,有些麻烦。
如果您对有什么建议,欢迎回复。想看代码或效果,也请告诉我,我会尽快回复的。
谢谢!
标签:保留 第一篇 如何 附加项 count 时间 编程 解决 第一个
原文地址:https://www.cnblogs.com/tobe-goodlearner/p/12862649.html