【问题标题】:Ruby nested while loop stops earlyRuby嵌套while循环提前停止
【发布时间】:2020-01-27 06:05:03
【问题描述】:

在尝试迭代字母数组并生成所有 6 个字符(仅限字母)字符串时,我的迭代似乎在最内层嵌套循环的单个 while 循环之后结束。代码如下。想法?


alpha = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

x1 = 0
x2 = 0
x3 = 0
x4 = 0
x5 = 0
x6 = 0

while x1<26
    y1 = alpha[x1]
    while x2<26
        y2 = alpha[x2]
        while x3<26
            y3 = alpha[x3]
            while x4<26
                y4 = alpha[x4]
                while x5<26
                    y5 = alpha[x5]
                    while x6<26
                        y6 = alpha[x6]
                        puts y1 + y2 + y3 + y4 + y5 + y6
                        x6 = x6 + 1
                    end
                    x5 = x5 + 1
                end
                x4 = x4 + 1
            end
            x3 = x3 + 1
        end
        x2 = x2 + 1
    end
    x1 = x1 + 1
end

编辑:我也很可能忽略了一种更简单的方法来实现预期的结果。如果是这样,请随时纠正我。

【问题讨论】:

  • 哦。我的。上帝。 (c)
  • 谁说你可以用任何语言编写 FORTRAN 的那句令人难忘的名言?还是Ok语言?
  • 大家好,但至少他试过了! :)
  • 您的代码没有按照您的意愿工作,因为您没有在每次外循环迭代中重置循环迭代器 (x1-x6)。将 x2=0 移到分配给 y1 之后,对于所有其他的也类似,它会起作用。

标签: ruby loops


【解决方案1】:

为了更详细地说明 Ruby,

loop.inject 'aaaaaa' do |memo|
  puts memo
  break if memo == 'zzzzzz'
  memo.next
end

或者简单地说:

( 'aaaaaa'..'zzzzzz' ).each &method( :puts )

【讨论】:

  • 嗯!从来没有见过这样的风格...不错的一个
  • 第二个很棒:)
  • 从 32 行丑陋到 1 行简洁。我喜欢它。
  • 请注意,鲍里斯的其他答案要好得多,因为这只适用于小写字母。 (或者只有大写,但不能同时使用)
  • @padde:或者大写的'Aaaaaa'..'Zzzzzz'。或骆驼套:'AaaAaa'..'ZzzZzz'。 Ruby 核心团队肯定喜欢玩。
【解决方案2】:
[*?a..?z].repeated_permutation(6).to_a.map &:join

Gives FATAL, FAILED TO ALLOCATE MEMORY 在我的机器上,

[*?a..?z].repeated_permutation(2).to_a.map &:join

工作正常。

好的,在#repeated_permutation之后调用#to_a是错误的,它是这样工作的:

[*?a..?z].repeated_permutation( 6 ).each { |permutation| puts permutation.join }

【讨论】:

  • 当我运行这个时,我得到: generate.rb:1: undefined method `repeated_permutation' for #<0x107f809c8>
  • &
【解决方案3】:

这是你想要的吗?它将生成所有唯一的排列,但不会加倍字符(如“aaaabb”)

('a'..'z').to_a.permutation(6).to_a

这是一个较短的版本,用于演示目的:

res = ('a'..'c').to_a.permutation(2).to_a 
res # => [["a", "b"], ["a", "c"], ["b", "a"], ["b", "c"], ["c", "a"], ["c", "b"]]

【讨论】:

  • 几乎,但是是的,我试图包含双倍字符。无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多