【发布时间】:2018-01-30 17:17:56
【问题描述】:
我目前正在编写一个小项目(这是在此处具体解释的方式),除了一个部分外,我一切正常。我有一个 List pZiegel by 参数,它在递归中被修改。因为不行,所以稍微调试了一下,发现了问题:有一次,列表在方法的末尾正好包含一个数字。然后,程序向后跳回一个递归深度。紧接着,它不再包含任何数字。号码是怎么丢的?作为参数的列表与传递引用一起使用,所以它不应该只是拒绝它,对吧?
public void erstelleBaum (Tree pTree, List<Integer> pZiegel, List<Integer> pFugen, int tiefe) {
if (tiefe / n >= maxHoehe) {
System.out.println("hi");
mauerGefunden = true;
alleFugen = pFugen;
}
if (!mauerGefunden) {
pZiegel.toFirst();
while (pZiegel.hasAccess() && !mauerGefunden) {
boolean ziegelHinzufügen = false;
möglich = true;
aktZiegel = pZiegel.getContent();
// ...
if (möglich) {
// ...
pZiegel.remove();
if (pZiegel.isEmpty()) {
ziegelHinzufügen = true;
pZiegel = new List();
for (int i = 1; i <= n; i++) {
pZiegel.append(i);
}
}
// Recursion
erstelleBaum(neuesBlatt, pZiegel, neueFugen, neueTiefe);
// Here, it tells me that pZiegel is empty (at recursion depth 17)
if (ziegelHinzufügen) {
pZiegel.toFirst();
while (pZiegel.hasAccess()) {
pZiegel.remove();
}
pZiegel.append(aktZiegel);
}
else {
pZiegel.toFirst();
while (pZiegel.hasAccess() && pZiegel.getContent() < aktZiegel) {
pZiegel.next();
}
if (pZiegel.hasAccess()) {
pZiegel.insert(aktZiegel);
pZiegel.toFirst();
while (pZiegel.getContent() != aktZiegel) {
pZiegel.next();
}
}
else {
pZiegel.toLast();
pZiegel.append(aktZiegel);
pZiegel.toLast();
}
}
}
pZiegel.next();
}
}
// Here, pZiegel contained one number (at recursion depth 18)
}
希望代码不要太乱。我试图避开不涉及 pZiegel 的部分。抱歉,变量是用德语命名的。我不想为这篇文章更改它们,因为我知道我会忘记更改代码中的某些内容。
如果有不清楚的地方,请随时询问。
【问题讨论】:
-
你试过调试吗?如果不是,这可能是学习编程的最佳优势之一的最佳时机,即如何调试。
-
就像我说的,我试过调试。我使用控制台来了解正在发生的事情。我真的无法解释这个数字是如何丢失的。
-
append不是java.util.List上的方法,这就是许多人认为List的意思。您使用的是哪个列表类? -
“列表作为参数使用传递引用”不,它们是按值传递的,就像 Java 中的所有内容一样。但是这里的“值”是变量的值,而不是它指向的东西。这就像在 C++ 中传递一个指针。
-
你是对的。我应该提一下,我正在使用从学校获得的一个非常简单的自定义课程。 append 方法只是在列表末尾添加内容。