我一直在嘗試3個小時,我無法理解這裏發生了什麼。在Java枚舉中遞歸?
我有一個枚舉「迷宮」。出於某種原因,當在這個枚舉上調用搜索方法時,它非常慢(運行3分鐘)。但是,如果我將相同的方法作爲靜態方法複製到另一個類中,並且我從枚舉'迷宮'中調用它,它將在一秒鐘內運行!
我不明白爲什麼? Java枚舉中的遞歸方法有什麼問題嗎?我究竟做錯了什麼?
public enum Maze
{
A("A.txt"), B("B.txt");
// variables here...
Maze(String fileName)
{
loadMap(fileName);
nodeDistances = new int[nodes.size()][nodes.size()];
setNeighbors();
setDistances();
}
... more methods here ...
private void setDistances()
{
nodeDistances = new int[nodes.size()][nodes.size()];
for (int i = 0; i < nodes.size(); i++) {
setMax(nodeDistances[i]);
// This works!!!
TestMaze.search(nodes, nodeDistances[i], i, 0);
// This DOESN'T WORK
//search(nodes, nodeDistances[i], i, 0);
}
}
public void setMax(int[] a) {
for (int i=0; i<a.length; i++) {
a[i] = Integer.MAX_VALUE;
}
}
public void search(List<Node> allNodes, int[] distances, int curNodeIndex, int curDist)
{
if (curDist < distances[curNodeIndex])
{
distances[curNodeIndex] = curDist;
for (Node n : allNodes.get(curNodeIndex).getNeighbors()) {
search(allNodes, distances, n.getNodeIndex(), curDist + 1);
}
}
}
}
public class TestMaze
{
public static void search(List<Node> allNodes, int[] distances, int curNodeIndex, int curDist)
{
if (curDist < distances[curNodeIndex])
{
distances[curNodeIndex] = curDist;
for (Node n : allNodes.get(curNodeIndex).getNeighbors()) {
search(allNodes, distances, n.getNodeIndex(), curDist + 1);
}
}
}
}
嘗試添加一些disgnostic輸出看到獲得通過的遞歸調用什麼參數,並且其中大部分時間都花在... – 2010-03-18 00:00:43
是問題仍然存在,即使我讓靜態的:S * – 2010-03-18 00:10:27
*爲什麼你使用枚舉而不是類? – 2010-03-18 00:20:45