好吧,所以我有一个常规的节点列表,其中包含成员信息和下一个。如何执行以下递归功能?
我需要递归地使用函数来计算平均值,然后比较每个节点是否大于平均值。
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);
}
我不相信你可以在同一时间做这两个任务的,递归与否。在比较每个节点之前,您需要整棵树的平均值。 –
但我已经有了。我确实获得了平均值,并在我到达最后一次递归调用(NULL)后测试了所有递归调用的开始时间,结果如同所计算的平均值。 –
当节点== NULL时,你是否应该做一些除了返回0以外的东西?你计算平均值,但你不用做任何事情 –