Ruby光纤附加简历

时间:2017-09-12 07:30:53

标签: ruby

在此示例中,光纤再次恢复以意外地再创建一个输出。目标是通过递归迭代所有可能性来打印一个数字数组的所有排列,并将结果打印出来。

class Fiber
  def self.wrap
    if block_given?
      f=Fiber.new do |*args|
         yield *args
      end
      return lambda{|*args| f.resume(*args) if f.alive? }
    end
  end
end
class FiberIterator
  def initialize
    @fiber_wrap=Fiber.wrap do
        yield
    end
  end
  def each
    while value=@fiber_wrap.call
      yield value
    end
  end
end
def perm(a)
  FiberIterator.new{ permgen(a,a.size) }
end
def permgen (a, n)
    if n == 0 then
       Fiber.yield a
    else
        n.times do |i|
           a[n-1], a[i] = a[i], a[n-1]
           permgen(a, n - 1)
           a[n-1], a[i] = a[i], a[n-1]
       end
    end
end
def printResult (a)
    p a
end

it=perm([1,2,3,4])
for a in it
  printResult(a)
end

结果将包括在打印完所有排列后的附加3。任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

原因是n.times返回n

 1.times { } # => 1

并且permgen的返回值被捕获并作为it的一部分进行评估,从而打印出来。太累了atm并且完全理解在何时何地试图解释它是如何被抓住并打印出来的,好像它是一种排列,但是你可以通过以下方式修复代码将permgen更改为:

def permgen (a, n)
  if n == 0 then
    Fiber.yield a
  else
    n.times do |i|
      a[n-1], a[i] = a[i], a[n-1]
      permgen(a, n - 1)
      a[n-1], a[i] = a[i], a[n-1]
    end

    nil # << This is all I added
  end
end

作为旁注,当我运行你的代码时,它最后打印了一个4而不是3,基于这个答案,这是一个错字或不同​​阵列或播放的结果周围有不同大小的排列。