对“回归”有点困惑

时间:2013-09-02 04:33:49

标签: ruby

以下是我在一本书中看到的代码,它打印"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,此代码无效。

2 个答案:

答案 0 :(得分:1)

这是递归电话。当你计算一个数组元素时,该函数调用自身附近有8个元素,如果元素不是“land”,它就完成了计算。

如果删除“return”行,它将永远执行,直到stackoverflow或超出数组的范围......

答案 1 :(得分:1)

这是递归,必须在找到“non-land”字段后立即停止。

return终止函数执行并返回结果。如果您不这样做,那么您将完全走出地图,导致尝试访问n-th world[-12][N]内的nil[N]元素,这会导致错误:

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