解的原则就是按照运算顺序一层一层的去掉,比如y=sin e^√x,
运算时sin,所以先去sin,就设h(x)=sin(x)。
去掉sin后的最后一步运算是求指数e^√x,所以设g(x)=e^x。
接着,去掉e后的最后一步运算是开方√x。
所以设f(x)=√x,至此可以把h,g,f,复合起来就是原函数了。
讨论函数y=
的单调性。
解:函数定义域为R;
令u=x2-4x+3,y=0.8u;
指数函数y=0.8u在(-∞,+∞)上是减函数;
u=x2-4x+3在(-∞,2]上是减函数,在[2,+∞)上是增函数;
∴ 函数y=
在(-∞,2]上是增函数,在[2,+∞)上是减函数。
class Category {
constructor(val) {
this.val = val;
}
addOne(x) {
return x + 1;
}}
上面代码中,Category是一个类,也是一个容器,里面包含一个值(this.val)和一种变形关系(addOne)。你可能已经看出来了,这里的范畴,就是所有彼此之间相差1的数字。
注意,本文后面的部分,凡是提到"容器"的地方,全部都是指"范畴"。
函数风格的编程拥有自己的一些特点:
函数作为一等公民。 可以作为参数传递、从函数里返回、可以赋值给变量。
带有闭包的 Lambda 表达式和匿名函数,这是广泛的多态。
不变性,大部分无态处理,在函数式程序中,变量是通过外部传入或者申明获得值的。变量不能被改变
基于不可变进而可以无副作用的调用。
通过 tail call 实现递归的性能优化。
提供动态的、可组合的开发思路。
//实现一个compose函数
function compose() {
var fns = [].slice.call(arguments)
return function (initialArg) {
var res = initialArg
for (var i = fns.length - 1; i > -1; i--) {
res = fns[i](res)
}
return res
}
}
const printMessage = compose(addToDom('msg'), h1, echo)
printMessage('Hello World')
其中的 h1 和 echo 都是函数,addToDom 很明显也能看出它是函数,表示把文本插入DOM中,代码我就省了。
程序分解为一些更可重用、更可靠且更易于理解的部分,然后再将他们组合起来,形成一个更易推理的程序整体。
compose 会让函数从最后一个参数顺序执行到第一个参数,compose 的每个参数都是函数,初始函数一定放到参数的最右面。
面向对象一直处于我能操作什么数据、这种数据我该怎么操作的范式中。而函数式编程一直沉浸于给我操作数据的方法中。面向对象最大优点是多态性和封装;函数式编程优势是抽象化和声明式命令风格,两者其实是正交,可互补的,可在同一程序中共存。
争论是面向对象好还是面向函数好跟争论哪门语言好一样都是非常极端的。对于面向对象来讲:存在的并不一定都是对象,函数就是对象;对于函数式编程来说:存在的并不总是纯粹的,副作用总是真实存在的。总之,面向对象侧重于分解,函数编程侧重于组合。
显然, f(1)=0, 于是有因式(x-1); f(x)/(x-1) = 2x^4-8x^3+8x^2-8x+6= g(x) 显然, g(1)=0, 于是有因式(x-1);g(x)/(x-...