2015-11-21 75 views
1

好吧,所以我有一个常规的节点列表,其中包含成员信息和下一个。如何执行以下递归功能?

我需要递归地使用函数来计算平均值,然后比较每个节点是否大于平均值。

int Acount(NodeType* Node, int sum, int& avg){ 

    if (Node == NULL){//last call 
     avg = sum/avg; 
     return 0; 
    } 
    else { 
     return (Acount(Node->next, sum + Node->info, ++avg) + (Node->info > avg ? 1 : 0)); 
     } 
} 

这很简单。问题是返回的值始终为0 的问题似乎是与

(Node->info > avg ? 1 : 0)); 

我做过测试,当我做到以下几点:

return (Acount(Node->next, sum + Node->info, ++avg) + Node->info; 

return (Acount(Node->next, sum + Node->info, ++avg) + avg; 

结果符合预期。在中,我得到了第一种情况下Node-> info的总和,并且在第二种情况下我得到的是平均*节点数。

这一点,我已经证明,该功能是完美的工作。

然而,当涉及到

(Node->info > avg ? 1 : 0)); 

看来是有问题的,这是相当奇特。如果我把例如:

(Node->info == 5 ? 1 : 0)); 

而且只有一个5中的节点,则函数返回1。所以一切工作的目的,但我不断收到一个0

以下是Node的主要功能和附加功能。

#include <iostream> 
using std::cout; 
using std::cin; 
using std::endl; 
struct NodeType{ 
    int info; 
    NodeType *next; 
}; 
//pre: first node passed is not NULL 
int Acount(NodeType* Node, int sum, int& avg){ 

    if (Node == NULL){//last call 
     avg = sum/avg; 
     return 0; 
    } 
    else { 
     return (Acount(Node->next, sum + Node->info, ++avg) + (Node->info > avg ? 1 : 0)); 
     } 
} 
void fill(NodeType*& Node){ 

    NodeType *temp; 
    Node = new NodeType; 
    Node->info = 0; 
    Node->next = NULL; 
    temp = Node; 

    for (int i = 1; i < 10; i++){ 
     temp->next = new NodeType; 
     temp = temp->next; 
     temp->info = i; 
     temp->next = NULL; 
    } 
} 
void print(NodeType* Node){ 
    NodeType *temp = Node; 
    while (temp != NULL){ 
     cout << temp->info << " "; 
     temp = temp->next; 
    } 
    cout << endl; 
} 
void Delete(NodeType* Node){ 
    NodeType *temp; 
    while (Node != NULL){ 
     temp = Node; 
     Node = Node->next; 
     delete temp; 
    } 
} 
void main(){ 

    int sum = 0, avg = 0; 
    NodeType *Node; 
    fill(Node); 
    print(Node); 

    cout << Acount(Node, sum, avg) << endl; 

    Delete(Node); 


} 
+2

我不相信你可以在同一时间做这两个任务的,递归与否。在比较每个节点之前,您需要整棵树的平均值。 –

+0

但我已经有了。我确实获得了平均值,并在我到达最后一次递归调用(NULL)后测试了所有递归调用的开始时间,结果如同所计算的平均值。 –

+0

当节点== NULL时,你是否应该做一些除了返回0以外的东西?你计算平均值,但你不用做任何事情 –

回答

1

在C++中,没有从表达式的从左到右(或从右到左)评估顺序的概念。操作员优先级将控制关联性,但在f1() + f2()的情况下,不保证在f2()(反之亦然)之前调用f1()。它可能取决于编译器或其他。

我的建议是表达分成2条不同的语句如下:

int tmp = Acount(Node->next, sum + Node->info, ++avg); 
return tmp + (Node->info > avg ? 1 : 0); 
+0

看起来不是很漂亮或非常递归 - 但看起来是唯一的解决方案。谢谢。 –

+0

如果问题停留在1行(使其看起来更具功能:)),那么你可以尝试','运算符(假设你已经定义了tmp): 'return tmp =(Acount(Node-> next,sum + Node-> info,++ avg),tmp +(Node-> info> avg?1:0))' – simpel01

1

我不确定您的代码是否定义了行为。但是,这条线

return (Acount(Node->next, sum + Node->info, ++avg) + (Node->info > avg ? 1 : 0)); 

取决于是否左边的加数或右边的加数是先计算出来的。

如果是左一个,然后Acount下降递归递增avg直到avg等于(这里10从零由main程序调用启动时),列表中的元素的数量。请注意,avg通过引用传递。因此,当递归返回时,这个词在右侧被加数

Node->info > avg 

因为Node->infofill常规设置为较小的再元素的数量值永远不会为真。

0

我不认为你的方法会起作用。

在此声明:

return (Acount(Node->next, sum + Node->info, ++avg) + (Node->info > avg ? 1 : 0)) 

你不知道什么时候第二项已进行评估。它没有在C++中定义。