ruby - 如何微调 map 功能并避免使用展平

标签 ruby algorithm functional-programming permutation

我有以下代码来列出给定字符串的所有可能排列。但是由于我笨拙的列表(ruby 数组)操作和对函数式编程的了解有限,我不得不使用 flatten 来获取结果数组。这几乎是一个黑客。如何重构代码并避免使用(滥用)展平?

class String
  def remove_char_at(i)
    if i==0
      self[1..-1]
    else
      self[0..i-1] + self[i+1..-1]
    end
  end
end

def permute(str,prefix="")

  if str.size==0
    prefix
  else
    str.chars.each_with_index.map do |s,i|
        permute(str.remove_char_at(i),prefix+s)
    end.flatten
  end

end

最佳答案

您可以在 SICP 的第一章中找到有关函数式编程的有趣内容

def permute2(str,prefix="")

  if str.size==0
    [prefix] #revise for concatenate with memo
  else
    str.chars.each_with_index.inject([]) do |memo, ary|
        s = ary[0]
        i = ary[1]
        memo += permute2(str.remove_char_at(i),prefix+s) #memoize
    end
  end

end

关于ruby - 如何微调 map 功能并避免使用展平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819515/

相关文章:

ruby-on-rails - rails : calling yield in a partial template?

ruby-on-rails - Rails - has_many 关系导致 NoMethodError

ruby-on-rails - 简单的递归方法

php - 用于提取 Microsoft Onenote 文档信息的库/服务

scala - 在不命名中间值的情况下对值进行链式操作

Clojure 调用递归函数时出错——很可能是括号问题

生成具有固定内边的多边形三角剖分的算法?

java - 从圈子里找一小群 friend ?

algorithm - 给定一台重量最大的电梯和重量为 x_i 的 n 个人,找出所需的最少乘车次数

javascript - 在 TypeScript 中,是否有任何方法可以将函数返回值键入函数本身?