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