zoukankan      html  css  js  c++  java
  • 用函数式编程思维解析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'(...)的情况]
  • 相关阅读:
    Linux实时性分析-schedule-调度器
    中断解析
    网络商城-PrestaShop
    和学生的学习互动记录(10嵌)
    QQ记录
    Windows7硬盘安装Fedora16图文教程
    今目标登录时报网络错误E110
    vs环境配置——vs快捷键配置——vs插件配置——vs环境设置
    如何防止app接口被别人调用
    mvc4 找到多个与名为“xx”的控制器匹配的类型
  • 原文地址:https://www.cnblogs.com/lantuoxie/p/8056825.html
Copyright © 2011-2022 走看看