
递归是函数式编程一大特色。函数式风格在 JS 圈子里也很流行。ES6 的数组解构有点模式匹配的味道,用 JS 也能以较为直观的方式写递归。
下面实现一个对数组做深度 flatMap 的函数,跟大家分享下 JS 写递归的样子。
flatMap: 把嵌套的数组扁平化。如 flatMap([ [1,2,3], [4,5,6] ]) = [1,2,3,4,5,6]
函数式风格的伪代码:
flatMap([a, ...as]) = [...flatMap(a), ...flatMap(as)] where a = Array flatMap([b, ...bs]) = [b, ...flatMap(bs)] where b = Anything but Array flatMap([]) = [] 完整的 JS 代码:
const flatMap = function(t) { if (t.length === 0) { return []; } const [a, ...as] = t; if (!Array.isArray(a)) { return [a, ...flatMap(as)]; } return [ ...flatMap(a), ...flatMap(as) ]; }; 可以看到 JS 写出来也不算罗嗦,还是很清爽的。
很多人谈起递归就皱眉头,其实递归就是数学归纳法。知道最后返回的是什么类型,知道递归时每种参数的类型,大概想想,写就完事了。