用函数式编程思维解析anagrams函数
2024-09-05 02:24:50
//函数式编程思维分析 这个排列函数
const anagrams = str => {
if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
return str.split('').reduce((acc, letter, i) =>
acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []);
}; const result = anagrams('abc');
console.log(result);//['abc','acb','bac','bca','cab','cba']; //函数式编程基本思维:
//在函数式编程中,可以应用数学上的分配律和结合律,递归最好的理解方式
//这里用了分配率和结合律
//reduce(遍历+迭代)
//递归(组合分配律和结合律式子)
//map(运算分配律式子:展开式子) //以'abcd'为demo解析
//先用reduce 获得算子 'a' 'b' 'c' 'd'
//最终结果用[]来统计,或者叫记录吧
//递归: 'a'(...) 'b'(...) 'c'(...) 'd'(...) : 组合成分配律和结合律式子
//其中... ,这里以'a'(...) 为demo
//'a'(...)的...为'bcd'
//由递归再组合分配律和结合律式子 'a'('b'(...) + 'c'(...) + 'd'(...))
//由递归再组合分配律和结合律式子 'a'('b'('cd'+'dc') + 'c'('bd' + 'db') + 'd'('bc' + 'cb'));
//map用于运算分配律和结合律式子 'a'('bcd' + 'bdc' + 'cbd' + 'cdb' + 'dbc' + 'dcb');
//map用于运算分配律和结合律式子 'abcd' + 'abdc' + 'acbd' + 'acdb' + 'adbc' +'adcb';
//concat是+号
console.log(anagrams('abcd'));//['abcd','abdc','acbd','acdb','adbc','adcb',...余下的是'b'(...) 'c'(...) 'd'(...)的情况]
最新文章
- $(window).height(),在火狐下面获取的高度并不是可视区域的高度
- C++网络套接字编程TCP和UDP实例
- IOS开发基础知识--碎片14
- 以application/json 方式提交 然后用在php中读取原始数据流的方式获取 在json_encode
- HTML5 File详解
- C#、.Net代码精简优化(空操作符(??)、as、string.IsNullOrEmpty() 、 string.IsNullOrWhiteSpace()、string.Equals()、System.IO.Path 的用法)
- 使用Yeoman快速启动AngularJS项目开发
- VC----Class Style类风格和窗口风格
- java 调用微信截图工具
- mysql 触发器的使用(备忘)
- 在Chrome Console中加载jQuery
- Spring源码入门——AnnotationBeanNameGenerator解析
- 【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)
- jquery之前后台交互
- linux运维基础__争取十月前研究的差不多
- MYSQL数据库学习八 触发器的操作
- MVC架构介绍-框架分层
- [LeetCode] questions conclusion_ Binary Search
- linux基础02-bash特性
- 关于class produre