作为练习的一部分,我正在编写一个递归代码来计算队列中的节点数。我添加/修改的代码部分(在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
变量(我认为!)或多或少做同样的事情,即递增所需的变量。
答案 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;
}