这个递归哪里出了问题?

哒哒路 2011-05-03 11:19:01
我做了一个模拟树,就是点击当前菜单的时候获取当前菜单顶级父菜单名称,代码如下:

public class TestTree {
/**
* 原始数据
* @return
*/
public static List<Tree> setTree() {
List<Tree> list = new ArrayList<Tree>();
Tree t = new Tree();
t.setRowId("001");
t.setParentId("0");
t.setTreeName("书籍");
list.add(t);

Tree t2 = new Tree();
t2.setRowId("003");
t2.setParentId("001");
t2.setTreeName("小说");
list.add(t2);

Tree t3 = new Tree();
t3.setRowId("004");
t3.setParentId("003");
t3.setTreeName("倚天屠龙记");
list.add(t3);
return list;
}

public static void main(String[] args) {
List<Tree> treeList = setTree();
Tree t = new TestTree().getTree("004", treeList);
}

/**
* 根据传入的rowId,查找顶级父菜单名称.
* @param rowId
* @param treeList
* @return
*/
public Tree getTree(String rowId, List<Tree> treeList) {
Tree t1 = null;
for (Tree t : treeList) {
if (rowId.equals(t.getRowId())) {
if (!t.getParentId().equals("0")) {
t1=getTree(t.getParentId(),treeList);
} else {
t1 = t;
System.out.println("找到顶级菜单名称为:"+t1.getTreeName());
break;
}
}
}
System.out.println("test");
return t1;
}
}

Tree.java

public class Tree {
private String rowId;
private String treeName;
private String parentId;
private String url;
public String getRowId() {
return rowId;
}
public void setRowId(String rowId) {
this.rowId = rowId;
}
public String getTreeName() {
return treeName;
}
public void setTreeName(String treeName) {
this.treeName = treeName;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}

运行结果:
找到顶级菜单名称为:书籍
test
test
test

问:为什么我在找到了顶级菜单后还会输出3次test,明明就break了,这个递归哪里出了问题?该怎么改?
...全文
165 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqs12ec056 2011-05-04
  • 打赏
  • 举报
回复
返回三个test,说明这个树是三层
这样测试可能你就明白了。

System.out.println("test");
System.out.println("返回Tree名称:"+t1.getTreeName());
return t1;
xjmlj2010 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 magong 的回复:]
递归没问题。

break只是退出循环,但是没有办法退出递归链。

System.out.println("test");
改成
System.out.println("Parent node of current node found.");
还是蛮贴切的。
[/Quote]

24K純帥 2011-05-04
  • 打赏
  • 举报
回复
LZ你的test是在for循环外面的,肯定会执行
magong 2011-05-04
  • 打赏
  • 举报
回复
递归没问题。

break只是退出循环,但是没有办法退出递归链。

System.out.println("test");
改成
System.out.println("Parent node of current node found.");
还是蛮贴切的。
哒哒路 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 magong 的回复:]

引用 6 楼 cmk_ke 的回复:

那如果我想再它找到顶级菜单后,直接退出递归链,不再执行3次test,我该怎么改?因为我感觉我既然找到了他的顶级菜单名称,然后又继续循环3次,有点浪费时间。

楼主好糊涂,递归链是调用栈控制的,哪能退出呢。
你担心的继续循环3次的事情是没有的,只不过经过3次递归找到根节点,3次递归都需要把自己的事情做完,楼主不喜欢,大可以将这System.out.……
[/Quote]
哦,是我理解不够深刻了
magong 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cmk_ke 的回复:]

那如果我想再它找到顶级菜单后,直接退出递归链,不再执行3次test,我该怎么改?因为我感觉我既然找到了他的顶级菜单名称,然后又继续循环3次,有点浪费时间。
[/Quote]
楼主好糊涂,递归链是调用栈控制的,哪能退出呢。
你担心的继续循环3次的事情是没有的,只不过经过3次递归找到根节点,3次递归都需要把自己的事情做完,楼主不喜欢,大可以将这System.out.println("test");语句删除掉好了。
哒哒路 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 leehomwong 的回复:]

LZ你的test是在for循环外面的,肯定会执行
[/Quote]
那如果我想再它找到顶级菜单后,直接退出递归链,不再执行3次test,我该怎么改?因为我感觉我既然找到了他的顶级菜单名称,然后又继续循环3次,有点浪费时间。
kevinlee0755 2011-05-03
  • 打赏
  • 举报
回复
break 是退出for循环
然后就是执行

System.out.println("test");
return t1;

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧