【问题标题】:Recursion: Two-Dimensional Grids递归:二维网格
【发布时间】:2013-04-08 10:29:57
【问题描述】:

http://tinyurl.com/dy4dwf9(Google 图书。原始链接很长。)

谁能解释一下这个递归程序是如何工作的?我不明白这如何不会导致无限循环。当它到达“eraseBlob(row-1, col);”时,它不会一直循环回到同样的方法吗?因此,它将重复“eraseBlob(row-1, col);?”最后,它说如果“image[row][col] = WHITE;”移到最后会导致无限循环,但是,我不明白即使在开始时它也不会导致无限循环。我不完全确定代码试图完成什么,我已经读过很多遍了。我相信它正在尝试将 a 单元格以及原始单元格下方、上方、左侧和右侧的单元格更改为白色。如有错误请指正。

谢谢!

【问题讨论】:

    标签: java


    【解决方案1】:

    该算法依次查看每个单元格的邻居。如果单元格是黑色的,它将变成白色,并查看邻居。对于每个黑人邻居,它将查看所​​有黑人邻居,然后重复。因此,通过在查看邻居之前将初始单元格设置为白色,它可以防止无限循环(因为如果 B 是 A 的邻居,并且两者都是黑色,那么 A 将查看 B 将查看 A 将... -但是如果我们把A设置为白色,那么B看的时候就不会打扰A的邻居了,也没有无限循环)。

    【讨论】:

    • 好的,所以说初始单元格是白色的,然后它转到“eraseBlob(row-1, col);”,这会使第 1 行单元格变为白色。这之后会发生什么?它会去“eraseBlob(row+1, col);吗?”
    • 当然,如果它还没有,它只会使单元格变白。如果一个单元格开始是黑色的,算法将访问第一个邻居,(row-1,col);假设我们从 row=3, col=3 开始。如果那个 (2,3) 是黑色的,它将访问它的所有邻居,从 (1,3) 开始(因为当它被调用时,row 是 2,而不是 3)。就这样继续下去。
    • 所以如果 (1,3) 是黑色的,它变成了白色,它会不会从 eraseBlob(row-1, col); 开始下一个到 (0,3)在行变白后发生。
    • 我想是的,是的。你总是可以编写代码,并让它打印出它正在访问的单元格,如果你想确保......请注意函数中第一行的重要性,它检查你是否仍在数组的范围内 -没有它,你很快就会得到一个异常。
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2014-02-17
    • 2013-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多