首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用递归、Ramda.js和无点样式重构字符串的Ramda.js()

使用递归、Ramda.js和无点样式重构字符串的Ramda.js()
EN

Stack Overflow用户
提问于 2016-05-17 12:47:03
回答 1查看 266关注 0票数 1

我一直试图使用一种使用getPermutations()的无点方法将原来的解决方案重构为Ramda.js ()函数。是否有可能进一步重构它,朝向无点的风格。看起来我把事情弄得更糟了。此外,当我运行测试时,重构版本中当前存在一个bug : TypeError: reduce: list必须是数组或可迭代的。

原解决方案:

代码语言:javascript
复制
// getPermutations :: String -> [String]
function getPermutations(string) {
  function permute(combination, permutations, s) {
    if (!s.length) {
      return permutations[combination] = true;
    }

    for (var i = 0; i < s.length; i++) {
      permute( combination.concat(s[i])
             , permutations
             , (s.slice(0, i) + s.slice(i+1))
             );
    }
    return Object.keys(permutations);
  }

  return permute('', {}, string);
}

我试图用Ramda.js重构:

代码语言:javascript
复制
var _ = require('ramda');

// permute :: String -> {String: Boolean} -> String -> [String]
var permute = _.curry(function (combination, permutations, string) {
  // callPermute :: String -> ({String: Bool} -> Char -> Int -> String) -> IO
  var callPermute = function (combination) {
    return function (acc, item, i, s) {
      return permute( _.concat(combination, item)
                    , acc
                    , _.concat(_.slice(0, i, s), _.slice(i + Infinity, s))
                    );
    };
  };

  var storeCombination = function () { 
    return permutations[combination] = true;
  };

  // should be an ifElse, incorporating compose below
  _.when(_.not(string.length), storeCombination);

  return _.compose( _.keys
                  , _.addIndex(_.reduce(callPermute(''), {}))
                  ) (string.split(''));
});

// getPermutations :: String -> [String]
var getPermutations = permute('', {});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 17:52:57

你的解决方案似乎有几个问题,恐怕我没有时间去追查它们。(我看到的第一件事是您使用addIndex不正确。)

但是,如果您想在Ramda中看到一个工作的permutation函数,那么不久前的这是我写的

代码语言:javascript
复制
// permutations :: [a] -> [[a]]
const permutations = (tokens, subperms = [[]]) =>
  R.isEmpty(tokens) ?
    subperms :
    R.addIndex(R.chain)((token, idx) => permutations(
      R.remove(idx, 1, tokens), 
      R.map(R.append(token), subperms)
    ), tokens);

R.map(R.join(''), permutations(['A', 'B', 'C'])); 
//=> ["ABC", "ACB", "BAC", "BCA", "CAB", "CBA"]

(您可以在Ramda REPL上玩这个。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37276672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档