在力扣上遇到的一个题目如果不知道这个方法的话会莫名的使用循环去做这个题
题目是有一个数组,数组的每一项都是一个函数,再给你一个初始值,从数组的最后一项开始运行直至第一项之后返回最终值这是我理解的思路
原题是这样的:
请你编写一个函数,它接收一个函数数组 [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
大多人的思路有以下两种,第一是从数组最后一项开始循环至第一项,第二就是将数组逆序之后从第一项至最后一项,这两段代码分别是以上的思路
第一种:
/**
* @param {Function[]} functions
* @return {Function}
*/
var compose = function(functions) {
return function(x) {
let res = x
for(let item = functions.length -1 ; item>=0; item--){
res = functions[item](res)
}
return res
}
};
/**
* const fn = compose([x => x + 1, x => 2 * x])
* fn(4) // 9
*/
第二种:
/**
* @param {Function[]} functions
* @return {Function}
*/
var compose = function(functions) {
return function(x) {
let funs = functions.reverse();
funs.forEach(f=>{
x = f(x)
})
return x
}
};
还有更简单一种的方法就是题目中所提到的reduceRight方法,与reduce不同的是它用于从数组的最后一个元素开始,从右向左依次对数组中的每个元素执行一个回调函数,最终返回一个累积值。
该方法接受两个参数:回调函数和初始累积值。回调函数可以以四个参数进行定义:累积值(之前的回调返回值或初始累积值)、当前值、当前索引和数组本身。回调函数的执行顺序是从数组的最后一个元素开始,然后依次向前处理每个元素。
理解上面这段话之后再看下面的这段代码(一步搞定)
/**
* @param {Function[]} functions
* @return {Function}
*/
var compose = function(functions) {
return function (x) {
return functions.reduceRight((target, fn) => fn(target), x)
}
};
原题大家可以看这里