2015-03-08 3 views
1

мне было интересно, как перевести этот кусок кода Python в Ruby:Как преобразовать функцию генератора питона в ruby?

from __future__ import generators 

def xcombinations(items, n): 
    if n==0: yield [] 
    else: 
     for i in xrange(len(items)): 
      for cc in xcombinations(items[:i]+items[i+1:],n-1): 
       yield [items[i]]+cc 

- мою попытку запроса:

def xcombinations(items, n) 
    Fiber.new do 
     if n == 0 
      Fiber.yield [] 
     else 
      for i in 0...items.length 
       xcombinations(items[0...i]+items[i+1..-1],n-1).resume.each do |cc| 
        Fiber.yield [items[i]] << cc 
       end 
      end 
     end 
    end 
end 
+0

положите это в свой вопрос, комментарии не являются местом для кода – MattDMo

+0

что такое переполнение стека? Я спросил, как перевести код. Я не просил вас перевести его для меня. – user1376243

+1

'items.combination (n)' приводит к перечислителю (генератору) в Ruby. (не уверен, что я понимаю код python) – steenslag

ответ

1

Я не уверен, что есть общий способ перевода от python до ruby, но, по крайней мере, ваш пример, он может быть переведен с использованием класса Enumerator следующим образом.

def xcombinations(items, n) 
    Enumerator.new do |y| 
     if n == 0 then 
      y << [] 
     else 
      for i in 0...items.length 
       xcombinations(items[0...i]+items[i+1..-1],n-1).each do |cc| 
        y << [items[i]]+cc 
       end 
      end 
     end 
    end 
end