收益递归

时间:2010-11-24 04:15:33

标签: ruby recursion

所以我想尝试做这样的事情:

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

但没有运气

感谢。

2 个答案:

答案 0 :(得分:13)

是的,您可以明确地将该块作为参数:

def func(x, y, &block)

您仍然可以使用yield关键字向它屈服,但您也可以在递归时传递它:

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

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

答案 1 :(得分:2)

你错过了在递归调用中传递阻止 递归调用应如下所示: -

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

由于你错过了在递归调用中传递块,当代码命中时: -

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

方法func在递归调用中没有作为参数传递的块,但ruby尝试调用不存在的块,从而导致错误。