以下是我在一本书中看到的代码,它打印"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
,此代码无效。
答案 0 :(得分:1)
这是递归电话。当你计算一个数组元素时,该函数调用自身附近有8个元素,如果元素不是“land”,它就完成了计算。
如果删除“return”行,它将永远执行,直到stackoverflow或超出数组的范围......
答案 1 :(得分:1)
这是递归,必须在找到“non-land”字段后立即停止。
return
终止函数执行并返回结果。如果您不这样做,那么您将完全走出地图,导致尝试访问n-th
world[-12][N]
内的nil[N]
元素,这会导致错误:
undefined method `[]' for nil:NilClass (NoMethodError)