Java 无法理解计数未递增的原因

Java 无法理解计数未递增的原因,java,recursion,data-structures,Java,Recursion,Data Structures,作为练习的一部分,我正在编写一个递归代码来计算队列中的节点数。我添加/修改的代码部分(在NodeQueue.java中)如下所示: 整个代码如下所示: Queue.java: Node.java: NodeQueue.java: SimpleQueue.java: 我无法理解为什么即使在队列中的几个节点排队后,我也会得到零。size变量返回正确的数字。我对count变量(我想!)的操作大致相同,即递增所需的变量 我的猜测如下 执行此行时 beingCountedNode=head的受保护节点 您

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

整个代码如下所示:

Queue.java:

Node.java:

NodeQueue.java:

SimpleQueue.java:


我无法理解为什么即使在队列中的几个节点排队后,我也会得到零。
size
变量返回正确的数字。我对
count
变量(我想!)的操作大致相同,即递增所需的变量

我的猜测如下

执行此行时
beingCountedNode=head的受保护节点

您的
为空

因此,
beingCountedNode
被设置为null。因此,
在以后的方法中,永远不要输入else子句

只需在
RecNodeCount()


你会看到这个方法到底发生了什么。

我猜是这样的

执行此行时
beingCountedNode=head的受保护节点

您的
为空

因此,
beingCountedNode
被设置为null。因此,
在以后的方法中,永远不要输入else子句

只需在
RecNodeCount()


您将看到此方法中到底发生了什么。

尽管我相信该方法会起作用(如果在调用之前正确设置了
beingCountedNode
。请参见@peter.petrov answer),但使用实例变量作为函数的参数是很奇怪的。我认为递归函数应该有签名
int Count(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
将为空,但这样做仍然很奇怪。

尽管我相信该方法会起作用(如果在调用之前正确设置了
beingCountedNode
。请参见@peter.petrov answer),但使用实例变量作为函数的参数是很奇怪的。我认为递归函数应该有签名
int Count(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
将为空,但这样做仍然很奇怪。

也许这不是您问题的直接答案,但为什么在这里使用递归和静态变量?“非常容易用简单的while计算节点

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

也许这并不能直接回答您的问题,但为什么在这里使用递归和静态变量呢?“非常容易用简单的while计算节点

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

我认为你是对的。我添加了一行
System.out.println(beingCountedNode.getElement()+)返回计数之前,它在SimpleQueue.main(SimpleQueue.java:34)的NodeQueue.RecNodeCount(NodeQueue.java:58)处的线程“main”java.lang.NullPointerException中返回了
异常
@vipulnj yes,这意味着当您第一次调用它时,
beingCountedNode
为空。您可能希望在构造函数中设置
beingCountedNode=head
,而不是在声明中。声明和初始化在构造函数之前运行,此时head仍然为null。我认为您是对的。我添加了一行
System.out.println(beingCountedNode.getElement()+)返回计数之前,它在SimpleQueue.main(SimpleQueue.java:34)的NodeQueue.RecNodeCount(NodeQueue.java:58)处的线程“main”java.lang.NullPointerException中返回了
异常
@vipulnj yes,这意味着当您第一次调用它时,
beingCountedNode
为空。您可能希望在构造函数中设置
beingCountedNode=head
,而不是在声明中。声明和初始化在构造函数之前运行,此时head仍然为null。这似乎是使用递归的赋值。“作为练习的一部分,我正在编写一个递归代码”也许是这样,但是如果你可以迭代地做,使用递归总是不好的。任何迭代地做的事情都可以递归地做,反之亦然。它并不总是坏的,可读性和可维护性在很多时候比执行速度/内存要求更重要。是的,但我试着写一个递归代码。不是学校/大学布置的作业,只是练习。这似乎是一个使用递归的作业。“作为练习的一部分,我正在编写一个递归代码”也许是这样,但是如果你可以迭代地做,使用递归总是不好的。任何迭代地做的事情都可以递归地做,反之亦然。它并不总是坏的,可读性和可维护性在很多时候比执行速度/内存要求更重要。是的,但我试着写一个递归代码。不是学校/大学布置的作业,只是练习。效果很好!没有意识到
beingCountedNode
被设置为空。尽管当@peter.petrov指出这一点时,我意识到了这一点。即使是重置
计数
部分,也同意!:D谢谢!:)很好用!没有意识到
beingCountedNode
被设置为空。尽管当@peter.petrov指出这一点时,我意识到了这一点。即使是重置
计数
部分,也同意!:D谢谢!:)链接到问题中未出现的代码通常是b