文章目录
首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地、科学地用java求出函数在一点的导数。
★引子
defd(f) :defcalc(x) :
dx= 0.000001 #表示无穷小的Δx
return (f(x+dx) - f(x)) / dx #计算斜率。注意,此处引用了外层作用域的变量 f
return calc #此处用函数作为返回值(也就是函数 f 的导数)
# 计算二次函数 f(x) = x2 + x + 1的导数
f = lambda x : x**2 + x + 1 #先把二次函数用代码表达出来
f1 = d(f)#这个f1 就是 f 的一阶导数啦。注意,导数依然是个函数
# 计算x=3的斜率
f1(3)
# 二阶导数
f2 = d(f1)
首先,直接上一段python代码,请大家先分析下上面代码是用什么方法求导的。请不要被这段代码吓到,你无需纠结它的语法,只要明白它的求导思路。
博主说“如果不用 FP,改用 OOP,上述需求该如何实现?俺觉得吧,用 OOP 来求导,这代码写起来多半是又丑又臭。”
我将信将疑,于是就用面向对象的java试了试,最后也没多少代码。如果用java8或以后版本,代码更少。
请大家思考一个问题,如何用面向对象的思路改写这个程序。请先好好思考,尝试编个程序再继续往下看。
考虑到看到这个标题进来的同学大多是学过java的,下面我用java,用面向对象的思路一步步分析这个问题。
★求导
文章开头我已近声明过了,本文不是来讨论数学的,求导只是我用来说明面向对象的一个例子。
如果你已经忘了开头那段代码的求导思路,请回头再看看,看看用python是如何求导的。
相信你只要听说过求导,肯定一眼就看出开头那段代码是用导数定义求导的。
代码中只是将无穷小Δx粗略地算做一个较小的值0.000001。
★最初的想法