我必须编写一个遍历链表并返回正整数的数量的递归方法。这是问题:

下面的方法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。

07-26 00:46