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'(...)的情况]
  • 相关阅读:
    android中的一个圆角图片
    android中一个评分的控件
    C++ primer(第五版)中需要复习第二遍的知识点记录
    在ubuntu18.04上交叉编译opencv2.4.9
    C6748和音频ADC连接时候的TDM以及I2S格式问题
    C6748的启动方式问题
    AK5703的ALC
    cool edit工具介绍及使用
    CCS编译环境及TI仿真器的使用
    把YUV转化成opencv中的Mat格式的两行代码备份
  • 原文地址:https://www.cnblogs.com/lantuoxie/p/8056825.html
Copyright © 2011-2022 走看看