JS 函数式编程之递归。

2019-08-29 14:36:37 +08:00
 ChefIsAwesome

递归是函数式编程一大特色。函数式风格在 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 写出来也不算罗嗦,还是很清爽的。

很多人谈起递归就皱眉头,其实递归就是数学归纳法。知道最后返回的是什么类型,知道递归时每种参数的类型,大概想想,写就完事了。

2522 次点击
所在节点    JavaScript
1 条回复
dany813
2019-08-29 20:16:35 +08:00
挺简洁的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/596210

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX