我必须编写一个遍历链表并返回正整数的数量的递归方法。这是问题:
下面的方法countPos
必须是采用Node
头的递归方法
作为其参数,在以head为首的列表中查找,并计算具有正数据字段的节点数。
我拥有的代码有效,但是我不明白它是如何工作的。
public int countPos(Node head) {
int count = 0;
if (head == null) { return count; }
if (head.data > 0) {
count++;
return count + countPos(head.next);
} else {
return count + countPos(head.next);
}
}
我遇到的问题是我不知道每次调用该方法时如何都不会将count设置回0。由于某种原因,下次调用该方法时,语句
int count = 0;
将被忽略。这是因为我也要返回count
吗?任何解释将不胜感激。谢谢。
最佳答案
每次调用countPos()
时,都会启动该函数的新版本。此函数从头开始,表示所有局部变量(count
)都是其自己的,并且countPos
的其他“副本”都看不到或修改其局部变量。
在这些“副本”或countPos
之间传递的唯一状态是作为参数(Node head
)传递的变量。
所以这是一个粗略的工作流程,假设列表为[1,-2,3]countPos
开始,并说正节点数等于1,因为“ 1”为正。正节点的总数等于1 +下一个函数返回的值。
下一个函数表示正节点数等于0 +不管下一个函数返回什么。
下一个函数表示正节点数等于1 +下一个函数返回的值
下一个函数看到head == null
,因此返回0。
现在,每个递归函数都一个接一个地返回到调用它的原始函数,当我们返回时,正节点总数“滚雪球”。
最后返回的总数为2。