java - 如何防止无限递归循环
问题描述
我似乎无法想出解决递归问题的方法。所以我有这个 Version 对象,它包含对它所依赖的其他版本对象的引用列表。
版本
{
"id": "id1",
"version": "1",
"dependencies": [
{
"id": "id2"
},
{
"id": "id3"
}
]
}
当我检索这个对象时,我还必须检索它的依赖项以及依赖项的依赖项,直到最终结束,这看起来像这样
版本Dto
{
"id": "id1",
"version": "1",
"dependencies": [
{
"id": "id2",
"version": "2",
"dependencies": [
{
"id": "id4",
"version": "4",
"dependencies": []
}
]
},
{
"id": "id3",
"version": "3",
"dependencies": []
}
]
}
这是我检索版本的递归函数
public VersionDto getVersion(String id)
{
//Retrieves from database
Version version = versionDAO.getVersion(id);
//Convert to Dto (basic fields)
VersionDto versionDto = new VersionDto(version);
//Recursivly retrieve dependencies
for (Map<String, String> dep : version.getDependencies()) {
VersionDto dto = new VersionDto();
//Recursive call
dto = getVersion(dep.get("id"));
versionDto.getDependencies().add(dto);
}
return versionDto;
}
但是,在版本可能是嵌套依赖项之一的依赖项的情况下,我遇到了可能的无限循环问题,例如 v1 -> v2 -> v4 -> v1 导致无限重复。
知道如何解决和防止这种无限循环,因此如果版本都准备好更早发生,它应该跳过它?
编辑:使用全局列表的解决方案
public VersionDto getVersion(String id)
{
//Check global list contains version
if (visited.contains(id)) {
return null;
}
visited.add(docId);
//Retrieves from database
Version version = versionDAO.getVersion(id);
//Convert to Dto (basic fields)
VersionDto versionDto = new VersionDto(version);
//Recursivly retrieve dependencies
for (Map<String, String> dep : version.getDependencies()) {
VersionDto dto = new VersionDto();
//Recursive call
dto = getVersion(dep.get("id"));
if(dep!= null) {
versionDto.getDependencies().add(dto);
}
}
return versionDto;
}
解决方案
希望这可以帮助。
如果 v1 的依赖关系总是相同的,那么它就可以工作。
dto = getVersion(dep.get("id"));
//check if the versionDto contains the dependecy already then break the loop here
versionDto.getDependencies().add(dto);```
推荐阅读
- c++ - 使用 shared_from_this 参数等待 std::future 获取 std::async 会阻止对 this 的破坏
- python - Python:“分箱”子数组
- javascript - Discord.js - 将 N 个命令参数存储到一个数组中
- python - 恢复错误地写入 CSV 作为字典的 JSON
- python - 如何将大量数字分成对并进行比较?
- git - 我可以在 Git 存储库中并行读取来自不同提交的文件吗?
- scala - 从列表行键创建 Spark DataFrame
- java - 具有 ADFS SAML 身份验证的 Java Web 服务客户端
- blockchain - 我是否需要帐户或 API 密钥才能使用 IPFS?
- c# - DateTimeUpDown 控件的特殊情况显示值