代码之家  ›  专栏  ›  技术社区  ›  Matt

收益率递归

  •  10
  • Matt  · 技术社区  · 15 年前

    所以我想这样做:

    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
    

    有可能做这样的事吗?我一直没有得到块给定(屈服)(LocalJumpError)。

    我甚至试着做一些不同的事情:

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

    但运气不好

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  13
  •   Paige Ruten    15 年前

    是的,可以显式地将块作为参数:

    def func(x, y, &block)
    

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

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

    这个 & 在这两种情况下都意味着 block

        2
  •  2
  •   Hemanth    15 年前

    在递归调用中缺少传递块。
    递归调用应如下所示:-

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

    由于在递归调用中未传递块,因此当代码命中时:-

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

    方法FUNC在递归调用中没有块作为参数传递,但Ruby试图调用一个不存在的块,从而导致错误。