2010-11-24 60 views
9

,所以我试图做这样的事情:递归产量

def func(x,y) 
    if x.length == 1 then 
     n = x.pop() 
     yield(n,y) 
    else 
     n = x.pop() 
     yield(n,func(x,y)) 
    end 
end 

调用它像:

a = func([1,2,3,4,5],0) do |x,y| 
    x+y 
end 

是否有可能做这样的事情?我一直没有给出任何块(yield)(LocalJumpError)。

我甚至尝试做的东西有点不同:

def func(x,y) 
    func(x,y) do |tail| 
     .. 
    end 
end 

,但没有运气

感谢。

+1

有趣。在做Ruby近6年的时间里,我从来没有见过这个问题出现过,现在同样的问题在10个小时内被两个不同的人从(看起来像)相反的两个方面提问:[ Ruby块的问题](http://StackOverflow.Com/q/4259652/) – 2010-11-24 14:31:29

+0

这很有趣。他们是类似的问题,除了我的产量在递减功能 – Matt 2010-11-24 18:44:14

回答

12

是的,你可以把块作为参数明确:

def func(x, y, &block) 

,您仍然可以产生将其与产量的关键字,但你也可以把它作为你递归:

yield(n, func(x, y, &block)) 

这两种情况下的&表示block参数不是普通参数,而是表示可以附加到任何Ruby方法调用的块。

2

您错过了在递归调用中传递该块。
递归调用应该像如下: -

yield(n,func(x,y)) { |x,y| x+y}) 

既然你错过传递块的递归调用,当代码点击: -

 if x.length == 1 then 
    n = x.pop() 
    yield(n,y) <<<< Here 

方法FUNC不在递归调用中,有块被作为参数传递,但是ruby试图调用一个不存在的块并因此发生错误。