2013-09-02 5 views
-2

Ниже приведен код, который я видел в книге, которая печатает "23":немного запутался о «возвращении»

M = 'land' 
o = 'water' 
world = [[o,o,o,o,o,o,o,o,o,o,o], 
    [o,o,o,o,M,M,o,o,o,o,o], 
    [o,o,o,o,o,o,o,o,M,M,o], 
    [o,o,o,M,o,o,o,o,o,M,o], 
    [o,o,o,M,o,M,M,o,o,o,o], 
    [o,o,o,o,M,M,M,M,o,o,o], 
    [o,o,o,M,M,M,M,M,M,M,o], 
    [o,o,o,M,M,o,M,M,M,o,o], 
    [o,o,o,o,o,o,M,M,o,o,o], 
    [o,M,o,o,o,M,o,o,o,o,o], 
    [o,o,o,o,o,o,o,o,o,o,o]] 

def continent_size world,x,y 
    if world[y][x] != 'land' 
    size =0 
    else 
    size = 1 
    end 

    world[y][x] = 'counted land' 

    size = size + continent_size(world,x-1,y-1) 
    size = size + continent_size(world, x , y-1) 
    size = size + continent_size(world, x+1, y-1) 
    size = size + continent_size(world, x-1, y) 
    size = size + continent_size(world, x+1, y) 
    size = size + continent_size(world, x-1, y+1) 
    size = size + continent_size(world, x , y+1) 
    size = size + continent_size(world, x+1, y+1) 
    size 

end 
puts continent_size(world, 5, 5) 

Мне интересно, почему этот код не работает, если удалить return до того size=0.

ответ

1

Это рекурсия, который должен быть остановлен немедленно после «не-земли» Поле находится.

return завершает выполнение функции и возвращает результат. Если бы не сделать это, вы должны выйти из карты на все, что приводит к попытке доступ n-th элемента в world[-12][N], который nil[N], что приводит к ошибке:

undefined method `[]' for nil:NilClass (NoMethodError) 
1

Это рекурсивный звонок. Когда вы вычисляете элемент массива, функция вызывает себя с 8 элементами рядом, и если элемент не «земля», он заканчивает вычисление.

Если удалить строку «возврата», он не будет выполняться до тех пор навсегда StackOverflow или из связанного массива ...