Tôi khuyên bạn nên sử dụng Array#product
.
[:a, :b].product [4,5]
Điều này sẽ mang lại kết quả bạn muốn.
irb(main):001:0> [:a, :b].product [4,5]
=> [[:a, 4], [:a, 5], [:b, 4], [:b, 5]]
irb(main):002:0>
Nếu bạn muốn tạo bộ tạo hoán vị, tôi đã viết một cái gì đó như thế này trước đây. Nhưng tôi cảnh báo bạn, nếu bạn có nhiều hoán vị để tính toán thì có thể mất một lúc. Bạn sẽ có thể lấy những gì bạn cần từ 40 - 45 dòng đầu tiên của this file (tệp này vẫn là một thử nghiệm).
Bí quyết là xây dựng các điều tra viên sử dụng Ruby 1.9.2 để làm việc theo cách của bạn thông qua một mảng các mảng. Vì vậy, bạn đầu tiên xây dựng một điều tra viên sẽ không ngừng chu kỳ thông qua một mảng, và trong bảng liệt kê mảng của bạn, bạn theo dõi tập đầu ra đầu tiên và kết thúc vòng lặp khi được nhấn lần thứ hai. Đây là cách duy nhất tôi có thể tìm ra cách chấm dứt vòng lặp như vậy.
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 }
Nguồn
2012-07-05 20:36:47
Bạn có thể làm rõ những gì bạn đang yêu cầu không? Làm thế nào bạn nên xây dựng những gì? Bạn đang cố tạo một lớp có tên 'CartesianProduct' sẽ làm gì được hiển thị? – denniss
Có, nó đòi hỏi một phương pháp lớp học. Tôi biết cách xây dựng một phương thức thể hiện để trả về một giá trị, nhưng tôi không biết cách xây dựng phương thức lớp để sửa đổi giá trị của một đối tượng lớp. – ZhijieWang
Đây có phải là bài tập về nhà không? Nếu có, điều đó là ổn, mọi người sẽ cố gắng đưa bạn đi đúng hướng. – steenslag