用函数式编程思维解析anagrams函数
//函数式编程思维分析 这个排列函数 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'(...)的情况]