【问题标题】:Recursion in yield收益率递归
【发布时间】:2011-05-14 21:15:43
【问题描述】:

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

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

但没有运气

谢谢。

【问题讨论】:

  • 有趣。在从事 Ruby 近 6 年的工作中,我以前从未见过这个问题突然出现,而现在,来自地球两端(看起来像什么)的两个不同的人在短短 10 小时内就提出了完全相同的问题:@ 987654321@
  • 这很有趣。它们是类似的问题,除了我的在产量中具有递归函数

标签: ruby recursion


【解决方案1】:

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

def func(x, y, &block)

你仍然可以使用 yield 关键字让出它,但你也可以在递归时传递它:

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​​ 尝试调用不存在的块并因此出现错误。

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 2015-04-29
    • 2014-10-20
    • 2019-04-14
    • 2010-12-21
    • 2020-11-20
    • 2012-11-26
    • 2014-03-21
    • 2020-08-04
    相关资源
    最近更新 更多