好的,所以我有一个常规的节点列表,包含成员信息和下一个。
我需要递归地使用函数来计算平均值,然后比较每个节点是否大于平均值。
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);
}
答案 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 ++中定义。