无法理解为什么计数不会增加

时间:2014-03-25 17:36:28

标签: java recursion data-structures

作为练习的一部分,我正在编写一个递归代码来计算队列中的节点数。我添加/修改的代码部分(在NodeQueue.java中)在这里:

public class NodeQueue implements Queue
{
    static protected int count;                 //for RecNodeCount method only
    protected Node beingCountedNode = head;     //for RecNodeCount method only

// other methods..

public int RecNodeCount()
    {
        if(beingCountedNode == null)
            return count;
        else
        {
            count++;
            beingCountedNode = beingCountedNode.getNext();
            return RecNodeCount();
        }
    }

整个代码如下:

Queue.java:http://pastebin.com/raw.php?i=Dpkd8ynk

Node.java: http://pastebin.com/raw.php?i=Zy0KbrtJ

NodeQueue.java:http://pastebin.com/raw.php?i=j6hieiLG

SimpleQueue.java:http://pastebin.com/raw.php?i=vaTy41z4

我无法理解为什么即使在排队队列中的几个节点后我也变为零。 size变量返回正确的数字。我对count变量(我认为!)或多或少做同样的事情,即递增所需的变量。

3 个答案:

答案 0 :(得分:2)

我的猜测如下。

执行此行时 protected Node beingCountedNode = head;

您的head为空。

因此beingCountedNode设置为null。因此,
稍后在您的方法中,您永远不会输入else子句。

只需在System.out.println中添加几个RecNodeCount()来电 你会看到这种方法到底发生了什么。

答案 1 :(得分:2)

虽然我相信该方法可行(如果在调用之前正确设置了beingCountedNode。请参阅@ peter.petrov回答),将实例变量用作函数的参数是很奇怪的。我认为递归函数应该有签名int Count( Node node ),它返回给定Node.之后(包括)// returns the number of nodes in the list public int Count(){ return CountHelper( head ); } // helper recursive function // returns the number of nodes in the list after and including "node". // call with head of the list to get the count of all nodes. private int CountHelper( Node node ) { if( node == null ) return 0; else return 1 + CountHelper( node.getNext() ); }

的节点数
count

另请注意,在您当前的示例中,您永远不会重置RecNodeCount(),因此如果我连续两次调用beingCountedNode,您的方法会告诉我计数是实际的两倍。编辑,实际上我想它不会因为{{1}}为空,但这样做仍然很奇怪。

答案 2 :(得分:0)

也许这不是你问题的直接答案,但为什么你甚至在这里使用递归和静态变量?是'用简单的方法很容易计算节点数。

public int nodeCount(Node node) {
    int result = 0;
    while(node != null) {
        node = node.getNext();
        result++;
    }
    return result;
}