gpt4 book ai didi

java - 当满足特定条件时停止递归方法

转载 作者:行者123 更新时间:2023-12-02 11:56:46 32 4
gpt4 key购买 nike

我有一个名为 Item 的类,它的定义如下:

public class Item {
private Long id;
private String text;
}

它的DTO如下:

public class ItemDTO {
private String id;
private String text;
private List<ItemDTO> children;
}

因此,使用 DAO 函数,我将使用其 id 从数据库中检索对象子对象,如下所示:

List<Item> children = itemDAO.findChildrenForItem(id);

对于每个 child ,我将检索它的 child 等等...,为此我创建了一个递归函数,在本例中有效:

public List<ItemDTO> process(Long id) {
List<ItemDTO> list = new ArrayList<>();

// Get children
List<Item> children = itemDAO.findChildrenForItem(id);

if (children != null && children.size() > 0) {
for (Item child : children) {
ItemDTO dto = new ItemDTO();
dto.setId(String.valueOf(child.getId()));
dto.setText(child.getLib());
dto.setChildren(process(child.getId()));
list.add(dto);
}
}

return list;
}

这里我想做的是,当我到达递归方法中的第 5 次迭代时停止并移动到 children 数组中的下一个元素。

因此,第一级子级将有 4 级子级,第二级子级将有 3 级子级,依此类推...,这就是我尝试过的:

public List<ItemDTO> process(Long id, Integer level) {
List<ItemDTO> list = new ArrayList<>();

// Get children
List<Item> children = itemDAO.findChildrenForItem(id);

if (children != null && children.size() > 0) {
for (Item child : children) {
level = level != null ? level : 0;
ItemDTO dto = new ItemDTO();
dto.setId(String.valueOf(child.getId()));
dto.setText(child.getLib());
level++;
dto.setChildren(level <= 4 ? process(child.getId(), level) : null);
list.add(dto);
level = 0;
}
}

return list;
}

但这没有用,我总是让 children 超过第四级。

我该如何解决这个问题?

最佳答案

您永远不会检查level的值来看看它是否达到了您的目标。您似乎还使 level 变量的使用过于复杂。考虑这样的结构:

public List<ItemDTO> process(Long id, Integer level) {
List<ItemDTO> list = new ArrayList<>();

// check the recursive logic's terminating condition
if (level == 5) {
// reached the intended bottom, return
return list;
}

List<Item> children = itemDAO.findChildrenForItem(id);
if (children != null && children.size() > 0) {
for (Item child : children) {
level = level != null ? level : 0;
ItemDTO dto = new ItemDTO();
dto.setId(String.valueOf(child.getId()));
dto.setText(child.getLib());

// you don't need a lot of logic here, just increment the level in the recursive call
dto.setChildren(process(child.getId(), level + 1));

list.add(dto);
}
}

return list;
}

因此,当达到目标“级别”时,该方法不会费心寻找子级,而只是返回一个空列表。 (或者你可以返回null,或者其他什么,这取决于你。)然后在递归到下一个“级别”时,你需要做的就是在当前“级别”上加1。

本质上,您似乎试图拥有一个全局变量,该变量知道递归的完整状态及其基本逻辑。相反,让递归方法本身根据传递给它的值知道何时停止。每次只需传递修改后的值即可。

关于java - 当满足特定条件时停止递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47556215/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com