Ruby按顺序从字符串中获取所有长度的排列

Ruby按顺序从字符串中获取所有长度的排列,ruby,recursion,Ruby,Recursion,这是我的密码- $arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-" def scan(f) begin if f.size == 6 exit end $arr.each_char do |y| t = f + y puts t scan(t)

这是我的密码-

$arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"
def scan(f)
    begin
        if f.size == 6
              exit
        end
        $arr.each_char do |y|
            t =  f + y
            puts t
            scan(t)
        end
    end
end
我希望打印所有排列和长度都达到6,我已经尝试过这种递归方法。我得到的输出是-

A 
AA
AAA 
AAAA
AAAAA
然而,我寻求这样的东西-

A
AA
AB
AC
.
.
AZ
AAA
AAB
.
.
AAZ
.
.
upto 6 chars
在注释递归调用时,我看到它打印

AA
AB
AC
.
.

这在没有递归的情况下是可以的,但在递归的情况下是不行的。欢迎提出任何建议。谢谢。

因为您期待的是
A
AA
AAA
,等等。。。要包含在结果列表中,您可能会发现该方法很有用,因为您需要重复排列

不幸的是,排列的数量非常大(
$arr
包含64个符号),必须计算最多6个字符的排列。排列的数量为:

64^7 = 4_398_046_511_104
但是,这里仍然有一个计算最多
6
字符排列的示例:

(1..6).to_a.flat_map { |i| $arr.chars.repeated_permutation(i).map(&:join) }
即使对于
4
来说,它也相当慢,但这取决于您。

数组#重复排列可以在这里为您完成繁重的工作:

$arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"
def scan
  characters = $arr.chars

  (1..6).each do |length|
    characters.repeated_permutation(length) do |sequence|
      t = sequence.join
      puts t
    end
  end
end
或者作为更可重用的枚举器:

CHARACTERS = [*"A".."Z", *"a".."z", *"0".."9", "_", "-"]
def each_permuted_string(max_length = 6, &block)
  sequences = (1..max_length).map { |n| CHARACTERS.repeated_permutation(n) }

  if block_given?
    sequences.each { |seq| seq.lazy.map(&:join).each(&block) }
  else
    enum_for(__method__, max_length) { sequences.map(&:size).inject(:+) }
  end
end

each_permuted_string do |t|
  puts t
end

不过,这将需要很长时间——每个置换的字符串都有
值。size=>69810262080
值。这听起来可能是一个问题,你可以通过问一个关于你正在解决的更高层次问题的问题来获得更好的解决方案。

再加上一点额外的逻辑可能会有所帮助。手机现在,抱歉不能提供更多的洞察ATM。这是可行的,但我需要一个接一个的值,因为我必须将它们传递给另一个函数。无法在开始时使用它并将其保存在列表中,因为它需要相当长的时间,最多需要5个字符。它需要一个块。。。“当使用块调用时,产生数组元素长度n的所有排列,然后返回数组本身。”输出是否应该包含诸如“ABA”、“BAA”、“BAB”、“ZAA”之类的字符串?为什么“AAA”跟在“AZ”后面?它不应该是‘AZ’、‘Aa’、‘Ab’…'A9、A、A-、然后是“AAA”?很好地说明了问题的严重性。即使效率最高,也需要创建相当多的样本、计算和新对象来解决这个问题。是的,这正是我需要的,一个接一个。