在此示例中,光纤再次恢复以意外地再创建一个输出。目标是通过递归迭代所有可能性来打印一个数字数组的所有排列,并将结果打印出来。
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。任何人都可以帮忙吗?
答案 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
,基于这个答案,这是一个错字或不同阵列或播放的结果周围有不同大小的排列。