如何执行以下递归功能?

时间:2015-11-21 15:50:24

标签: c++ recursion nodes

好的,所以我有一个常规的节点列表,包含成员信息和下一个。

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

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);


}

3 个答案:

答案 0 :(得分:1)

我不确定您的代码是否已定义行为。但是,这一行

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

取决于是先计算左加数还是右加数。

如果是左边的那个,那么Acount会递归递归avg,直到avg等于列表中元素的数量(此处为10,从零开始时调用main例程)。请注意,avg通过引用传递。因此,当递归返回时,这个术语在正确的求和中

Node->info > avg

永远不会成为现实,因为Node->info例程中fill设置的值小于元素数。

答案 1 :(得分:1)

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

我的建议是将表达式分为两个不同的语句,如下所示:

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

答案 2 :(得分:0)

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

在此声明中:

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

您不知道何时评估第二个词。它没有在C ++中定义。