Python 代码有效,相同的 Java 代码无效
Python code works, same Java code does not
我有一张图,它被描述为具有结构的地图(Java 和 Python 都相同,但示例在 Python 中):
graph = {'A': ['B', 'C'],
'B': ['A', 'C', 'D'],
'C': ['A', 'B', 'D', 'F'],
'D': ['B', 'C'],
'E': ['F'],
'F': ['C', 'E']}
我想获取从 'A' 到 'E' 的所有路径。对于 Python 它完美地工作:
def find_all_paths(graph, start, end, path=[]):
path = path + [start]
if start == end:
return [path]
paths = []
for node in graph[start]:
if node not in path:
newpaths = find_all_paths(graph, node, end, path)
for newpath in newpaths:
paths.append(newpath)
return paths
OUTPUT: [['A', 'B', 'C', 'F', 'E'], ['A', 'B', 'D', 'C', 'F', 'E'], ['A', 'C', 'F', 'E']]
但是在 Java 我没有得到正确的结果:
static List<List<String>> findAllPaths(String start, String end, List<String> path) {
path.add(start);
if (start.equals(end)) {
return List.of(path);
}
List<List<String>> paths = new ArrayList<>();
for (String node : graph.get(start)) {
if (!path.contains(node)){
List<List<String>> newpaths = findAllPaths(node, end, path);
paths.addAll(newpaths);
}
}
return paths;
}
OUTPUT: [[A, B, C, D, F, E]]
我已经调试过了,我知道 Python 为每个函数调用存储 path
变量,而 Java 将这个变量存储为所有函数的全局变量。但是,我不确定。您有什么建议吗?
path = path + [start]
不等同于 path.add(start)
。 Python版本正在制作新的列表; Java 版本正在更改现有列表。
Java 相当于 path = path + [start]
是先复制列表,然后添加新元素。
path = new ArrayList<>(path);
path.add(start);
我有一张图,它被描述为具有结构的地图(Java 和 Python 都相同,但示例在 Python 中):
graph = {'A': ['B', 'C'],
'B': ['A', 'C', 'D'],
'C': ['A', 'B', 'D', 'F'],
'D': ['B', 'C'],
'E': ['F'],
'F': ['C', 'E']}
我想获取从 'A' 到 'E' 的所有路径。对于 Python 它完美地工作:
def find_all_paths(graph, start, end, path=[]):
path = path + [start]
if start == end:
return [path]
paths = []
for node in graph[start]:
if node not in path:
newpaths = find_all_paths(graph, node, end, path)
for newpath in newpaths:
paths.append(newpath)
return paths
OUTPUT: [['A', 'B', 'C', 'F', 'E'], ['A', 'B', 'D', 'C', 'F', 'E'], ['A', 'C', 'F', 'E']]
但是在 Java 我没有得到正确的结果:
static List<List<String>> findAllPaths(String start, String end, List<String> path) {
path.add(start);
if (start.equals(end)) {
return List.of(path);
}
List<List<String>> paths = new ArrayList<>();
for (String node : graph.get(start)) {
if (!path.contains(node)){
List<List<String>> newpaths = findAllPaths(node, end, path);
paths.addAll(newpaths);
}
}
return paths;
}
OUTPUT: [[A, B, C, D, F, E]]
我已经调试过了,我知道 Python 为每个函数调用存储 path
变量,而 Java 将这个变量存储为所有函数的全局变量。但是,我不确定。您有什么建议吗?
path = path + [start]
不等同于 path.add(start)
。 Python版本正在制作新的列表; Java 版本正在更改现有列表。
Java 相当于 path = path + [start]
是先复制列表,然后添加新元素。
path = new ArrayList<>(path);
path.add(start);