Java 链表的递归方法

Java 链表的递归方法,java,recursion,Java,Recursion,我有一个关于我写的递归函数的问题。函数应该返回列表中所有偶数项的总和。下面给出了代码以及辅助递归方法 public int sumEven() { return sumEven(head); } private int sumEven(IntListNode n) { int nodeNumber=1; int count=0; if(n==null){ return count; } else if(nodeNumber%2==0

我有一个关于我写的递归函数的问题。函数应该返回列表中所有偶数项的总和。下面给出了代码以及辅助递归方法

public int sumEven() {

return sumEven(head);
}


private int sumEven(IntListNode n) {
    int nodeNumber=1;
    int count=0;
    if(n==null){
        return count;
    }
    else if(nodeNumber%2==0 && n.getNext()==null){
        return n.getValue();
    }
    else if(nodeNumber%2!=0 && n.getNext()==null){
        return 0;
    }
    else if(nodeNumber%2==0 &&(n.getNext()).getNext()==null){
        return n.getValue();
    }
    else{
        nodeNumber++;
        if(nodeNumber%2==0){
            count+=n.getValue();
            return count+ sumEven(n.getNext());
        }
        else{
            return count + sumEven(n.getNext());
        }


    }


}
我不确定是否可以像在函数中那样使用nodeNumber和count。每次调用sumEven时,节点枚举数和计数不是都被设置回零吗。如果是这样,那么这个方法就不可能正常工作了?那么,我还可以如何跟踪计数和节点计数的增加


非常感谢

您可以这样尝试:

public static void main(String args[]) {
    List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
    System.out.printf("Sum of %s is: %s\n", list, sumOfEvenNumbers(list.iterator()));
}

private static int sumOfEvenNumbers(Iterator<Integer> iterator) {
    if (!iterator.hasNext()) return 0;
    Integer value = iterator.next();
    return sumOfEvenNumbers(iterator) + (value % 2 == 0 ? value : 0);
}

下面是您可以完成的简单伪代码:

int findSum(nodeptr temp, int count, int sum)
{
    if(temp==NULL)  // this indicates end of list. Return the sum until now
       return sum;
    count++;   //increment count:number of nodes encountered
    if(count%2==0)  //if it is even node, add the contents of the node
    {            
        sum += temp->value;
    }
    return findSum(temp->next, count, sum); //recursively call the function on subsequent nodes
}
从主代码中调用函数,如下所示

res = findsum(myList, 0, 0);
我遵循了C/C++惯例。适当地改变它。
这很容易理解。关键思想是将更新后的值作为方法参数传递,而不是使用局部变量。

使用参数而不是局部变量。