前言:锻炼自己的思想,规范自己的编程思路。每天一道算法题,督促自己。
靡不有初,鲜克有终,加油坚持下去。
问题:
请你编写一个函数,它接收一个函数数组 [f1, f2, f3,…], fn] ,并返回一个新的函数 fn ,它是函数数组的 复合函数 。
[f(x), g(x), h(x)] 的 复合函数 为 fn(x) = f(g(h(x))) 。
一个空函数列表的 复合函数 是 恒等函数 f(x) = x 。
你可以假设数组中的每个函数接受一个整型参数作为输入,并返回一个整型作为输出。
示例:
示例1:
输入:functions = [x => x + 1, x => x * x, x => 2 * x], x = 4
输出:65
解释:
从右向左计算......
Starting with x = 4.
2 * (4) = 8
(8) * (8) = 64
(64) + 1 = 65
示例2:
输入:functions = [], x = 42
输出:42
解释:
空函数列表的复合函数就是恒等函数
思路:看到这个题,我想到了小学做的复合函数还有递归,一层一层深入,直到拿到最终的变量值,然后用变量值回退并且计算递归进来的表达式,得到最终值。
看到示例2,我首先先判断一下数组长度,如果长度为0,就直接返回x的值(看了很久才知道functions是数组名,还以为是什么参数函数)
然后用递减的for循环,从数组的最后一个值开始,与x值相乘,然后赋值给x,如此反复,得到最终的值,return出去。
基于上述思想,代码如下:
/**
* @param {Function[]} functions
* @return {Function}
*/
var compose = function(functions) {
return function(x) {
if(functions.length == 0 ) return x
for(let i = functions.length-1;i>=0;i--){
x = functions[i](x)
}
return x
}
};
执行结果如下:
结论:今天这个题目知道了functions是数组,逻辑就很简单了,小心注意,function是函数,functions是数组,不要想当然以为functions是函数了。今天写这题很晚了,明天加油,不许拖啦。