【问题标题】:How do I calculate the average of a linked list recursively?如何递归计算链表的平均值?
【发布时间】:2017-07-01 18:33:41
【问题描述】:

这是一个 java 代码,我应该在其中使用递归将链表的偶数相加。这是我想出的,但没有成功。我的 java 编译器在这个语句中进入了一个无限循环: ave(i.getNext());

    public double ave (Node b)
 {
    Node i = head;
     if (i == null)
         return 0;

     else 
    {
        if (i.getData()%2==0)
        {
            sum = i.getData() + sum;
            count++;
        }
        if (i.getNext() != null)
        ave(i.getNext()); 

     return sum/(double)count;
 }

【问题讨论】:

  • 你调用 i.getNext() 两次。这样你就失去了每一个第二个价值。一次存储在一个变量中,然后检查两次。
  • 真正的问题是,对于递归函数,你通常需要两个函数,一个启动进程,一个递归。你的问题是'Node i = head;'总是从第一个元素开始,从而产生一个无限循环
  • @JayC667 这是一个链表,他没有将它们从数据结构中弹出。所以,这不应该是问题
  • @JayC667 明白了。不过,我确实因为从堆栈顶部弹出一个元素太多次而让自己有些头疼。需要注意的地方。

标签: java recursion linked-list


【解决方案1】:

问题是您每次都将i 分配给headb 从未使用过!

你想要:

public double ave() {
    return aveRec(head, 0, 0);
}

private double aveRec(Node n, long sum, int count) {
    if (n == null) {
        if (count == 0) {
            // what to return if the linked list is empty?
            return 0;
        }
        return (sum * 1D) / count;
    }
    if (n.getData() % 2 == 0) {
        return aveRec(n.getNext(), sum + n.getData(), count + 1);
    } else {
        return aveRec(n.getNext(), sum, count);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多