【问题标题】:Java - Content of List is lost in recursionJava - 列表的内容在递归中丢失
【发布时间】: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 方法只是在列表末尾添加内容。

标签: java list recursion


【解决方案1】:

我相信 pZiegel 列表参考在某些时候会丢失。您应该检查 pZiegel 对象 ID(检查对象时显示的数字)以确保它在所有递归中都是相同的 List 实例。

请注意,您的代码中有一部分使 pZiegel 标识符引用了一个新列表

...
            if (pZiegel.isEmpty()) { 
                ziegelHinzufügen = true;
                pZiegel = new List();  // <---- this line
                for (int i = 1; i <= n; i++) {
                    pZiegel.append(i);
                }
            }
...

我相信您正在调用第 18 次递归,其中 pZiegel 引用了一个列表(可能为空)。在第 18 次递归中,该行被调用并且 pZiegel 开始引用一个新的 List(请注意最后一个 List 仍然存在并且由第 17 次递归的 pZiegiel 标识符引用)。在第 18 次递归调用的最后一行,您认为您正在检查第 17 次递归中的相同 pZiegiel 列表,但事实并非如此。

【讨论】:

  • 谢谢!通过删除该行(无论如何都没用......),问题不再发生。 :)
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2016-02-02
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多