Нужна помощь в понимании рекурсии в главе 10 Learn to Program от Chris Pine

Вопросы:

1.)Если world[y][x] != 'land'условие истинно, оно будет return 0. Кто сейчас это ценит? Коды после этого if-end statementвсе еще будут оцениваться?

2.)Есть 8 size = size + ...линий, которые представляют 8 соседей плитки (5,5). Поэтому, используя (5,5) и используя size = size + continent_size(world, x-1, y-1)линию, я знаю, что она будет считать (4,4), который в данном случае является o. Мой вопрос, так как (4,4) является o, который является awater, будет ли он по-прежнему считать (3,3), (2,2) и т.д. Или он остановится сразу после (4,4) и считать следующую size = size + ...строку?

# These are just to make the map easier for me to read.
# "M" is visually more dense then "o".
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'
    # Either it's water or we already counted it,
    # but either way, we don't want to count it now.
    return 0
  end

  # So first we count this tile...
  size = 1
  world[y][x] = 'counted land'

  # ...then we count all of the neighboring eight tiles
  # (and, of course, their neighbors by way of the recursion).
  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)

2 ответа

  1. 1) значение 0 будет принадлежать тому, кто вызвал эту функцию, скажем

    a = continent_size(world, x, y)
    

    теперь a равно 0. Остальные операторы не будут оцениваться, поскольку оператор return завершит выполнение этого метода.

    2 )между строками size = нет оператора return… так что он будет выполнять все из них

  2. 1) значение 0 будет возвращено в continent_sizemetehod instace, который вызвал экземпляр, о котором вы спрашиваете. Остальная часть if-endинструкции не будет вычислена, так как метод уже возвращает 0 вызывающему объекту.

    2) он «остановится» сразу после (4,4)(так как это вода, она просто вернется 0) и посчитает следующую size = ...строку действительно