Array#product
'u kullanmanızı öneririz.
[:a, :b].product [4,5]
İstediğiniz çıktıyı verecektir.
irb(main):001:0> [:a, :b].product [4,5]
=> [[:a, 4], [:a, 5], [:b, 4], [:b, 5]]
irb(main):002:0>
Eğer tembel bir permütasyon jeneratörü istiyorsanız, daha önce böyle bir şey yazdım. Ama sizi uyarıyorum, hesaplamak için çok sayıda permütasyonunuz varsa, bir süre alabilir. İhtiyacınız olanı ilk 40 - 45 satırından this file'dan alabilmeniz gerekir (bu dosya zaten bir deneme idi).
Numara, dizileri bir dizi boyunca çalışmak için Ruby 1.9.2 kullanarak numaralandırıcılar oluşturmaktır. Böylece, bir dizide sonsuz bir şekilde döngü yapacak bir numaralayıcı oluşturursunuz ve dizi dizisi numaralandırıcınızda ilk çıkış kümesini izler ve ikinci kez vurulduğunda döngüyü sonlandırırsınız. Böyle bir döngüyü nasıl sonlandıracağımı anlayabilmemin tek yolu buydu.
def infinite_iterator(array)
Enumerator.new do |result|
loop do
array.cycle { |item| result << item }
end
end
end
def cartesian_iterator(data)
Enumerator.new do |result|
first = data.map { |p| p.next }
result << first
i = 1
parts = first.dup
loop do
parts[2-i] = data[2-i].next
break if parts == first
result << parts.join
i = ((i + 1) % parts.size)
end
end
end
array = [ infinite_iterator([:a,:b]), infinite_iterator([4,5]) ]
generator = cartesian_iterator(array)
generator.each { |a| p a }
Lütfen ne için sorduğunuzu açıklayabilir misiniz? Neyi nasıl inşa etmelisin? Gösterilen şeyi yapacak 'CartesianProduct' adında bir sınıf oluşturmaya mı çalışıyorsunuz? – denniss
Evet, bir sınıf yöntemi gerektirir. Bir değer döndürmek için bir örnek yöntemini nasıl yapılandıracağımı biliyorum, ancak sınıf nesnesinin değerini değiştirmek için sınıf yöntemini nasıl yapılandıracağımı bilmiyorum. – ZhijieWang
Bu ev ödevi mi? Eğer öyleyse, sorun değil, insanlar sizi doğru yönde dürtmeye çalışacak. – steenslag