Рекурсия по доходности - PullRequest
       1

Рекурсия по доходности

10 голосов
/ 24 ноября 2010

Итак, я пытаюсь сделать что-то вроде этого:

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 ]

13 голосов
/ 24 ноября 2010

Да, вы можете явно принять блок в качестве аргумента:

def func(x, y, &block)

Вы все еще можете уступить ему с помощью ключевого слова yield, но вы также можете передать его по мере повторения:

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

& в обоих случаях означает, что аргумент block не является нормальным аргументом, но представляет блок, который можно присоединить к любому вызову метода Ruby.

2 голосов
/ 24 ноября 2010

Вам не хватает передать блок в рекурсивном вызове.
Рекурсивный вызов должен выглядеть примерно так: -

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

Поскольку вы пропустили пропуск блока в рекурсивном вызовекод попадает: -

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

метод func не имеет блока, переданного в качестве аргумента, в рекурсивном вызове, но ruby ​​пытается вызвать несуществующий блок и, следовательно, ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...