尽管有停止条件,仍会执行无限递归调用,因为参数不会前进
Infinitely recursive call is executed despite having stop condition, since the parameters don't advance
我有一个递归函数,我需要滚动浏览一组结构,这些结构以子列表的形式连续进入另一个。
节点结构
struct Intake{ // this is a sublist
int id;
string month;
int intakeEnergy;
struct Intake * next;
struct electricalDevices * firstED;
struct intakeEnergySector * linkIES;
Intake(int i, string m, int iE){
id = i;
month = m;
intakeEnergy = iE;
next = NULL;
firstED = NULL;
}
};
struct Home{ // this is a sublist
int code;
string address;
struct Home * next;
struct Intake * firstI;
struct homePersons * linkHP;
Home(int c, string ad){
code = c;
address = ad;
next = NULL;
firstI = NULL;
}
};
调用和递归函数
int recursiveTraversal(int idLocality, struct Home *homeToRoam, struct Intake *intakeToRoam, int idElectricalDevice){
if (homeToRoam == NULL)
return 0;
else{
intakeToRoam = homeToRoam -> firstI;
if (intakeToRoam == NULL)
return 0 + (recursiveTraversal(idLocality, homeToRoam -> next, intakeToRoam, idElectricalDevice));
else{
struct electricalDevices * temp = searchED(idLocality, homeToRoam -> code, intakeToRoam -> id, idElectricalDevice);
if (temp == NULL){
return 0 + (recursiveTraversal(idLocality, homeToRoam, intakeToRoam -> next, idElectricalDevice));
}else{
return (temp -> intakeEnergyPerHour) + (recursiveTraversal(idLocality, homeToRoam, intakeToRoam -> next, idElectricalDevice));
}
}
}
}
void monthlyConsumptionOfADeviceInALocality(int idLocality, int idElectricalDevice){
struct Locality * localityX = searchL(idLocality);
int monthlyConsumption;
if (localityX == NULL){
cout<<"\nThe Locality doesn't exist...\n";
return ;
}else{
monthlyConsumption = recursiveTraversal(idLocality , localityX -> firstH, NULL, idElectricalDevice);
cout<<"Monthly Consumption: "<<monthlyConsumption;
}
}
这里是函数的代码,问题是比如我给homeToRome节点赋值的时候,我把localityX -> firstH写到参数里,再放到递归函数里,感觉一样,赋值每个节点的第一个节点的子列表。
增加线
return 0 + (recursiveTraversal(idLocality, homeToRoam, intakeToRoam -> next, idElectricalDevice));
但是当我在递归调用中将 intakeToRoam 增加到下一个节点时,它设置相同。
即使我打印值 memory,intakeToRoam 与 intakeToRoam -> next 相比也是不同的值。
非常感谢您,感谢您的帮助!
你有无限递归,因为你总是用这行重置 intakeToRoam
:
intakeToRoam = homeToRoam->firstI;
如果删除此行,您现在会遇到识别迭代 intakeToRoam
列表的开始和结束的问题。解决此问题的最简单方法是保留 NULL
intakeToRoam
表示开始迭代并手动检查函数中列表的末尾,例如:
int recursiveTraversal(int idLocality, struct Home *homeToRoam, struct Intake *intakeToRoam, int idElectricalDevice){
if (homeToRoam == NULL)
return 0;
else {
if (intakeToRoam == NULL)
return 0 + (recursiveTraversal(idLocality, homeToRoam, homeToRoam->firstI, idElectricalDevice));
else {
struct electricalDevices * temp = searchED(idLocality, homeToRoam -> code, intakeToRoam -> id, idElectricalDevice);
int consumption = 0;
if (temp != NULL) consumption = temp -> intakeEnergyPerHour;
if (intakeToRoam->next != NULL)
return consumption + recursiveTraversal(idLocality, homeToRoam, intakeToRoam -> next, idElectricalDevice);
else
return consumption + recursiveTraversal(idLocality, homeToRoam->next, NULL, idElectricalDevice);
}
}
}
我有一个递归函数,我需要滚动浏览一组结构,这些结构以子列表的形式连续进入另一个。
节点结构
struct Intake{ // this is a sublist
int id;
string month;
int intakeEnergy;
struct Intake * next;
struct electricalDevices * firstED;
struct intakeEnergySector * linkIES;
Intake(int i, string m, int iE){
id = i;
month = m;
intakeEnergy = iE;
next = NULL;
firstED = NULL;
}
};
struct Home{ // this is a sublist
int code;
string address;
struct Home * next;
struct Intake * firstI;
struct homePersons * linkHP;
Home(int c, string ad){
code = c;
address = ad;
next = NULL;
firstI = NULL;
}
};
调用和递归函数
int recursiveTraversal(int idLocality, struct Home *homeToRoam, struct Intake *intakeToRoam, int idElectricalDevice){
if (homeToRoam == NULL)
return 0;
else{
intakeToRoam = homeToRoam -> firstI;
if (intakeToRoam == NULL)
return 0 + (recursiveTraversal(idLocality, homeToRoam -> next, intakeToRoam, idElectricalDevice));
else{
struct electricalDevices * temp = searchED(idLocality, homeToRoam -> code, intakeToRoam -> id, idElectricalDevice);
if (temp == NULL){
return 0 + (recursiveTraversal(idLocality, homeToRoam, intakeToRoam -> next, idElectricalDevice));
}else{
return (temp -> intakeEnergyPerHour) + (recursiveTraversal(idLocality, homeToRoam, intakeToRoam -> next, idElectricalDevice));
}
}
}
}
void monthlyConsumptionOfADeviceInALocality(int idLocality, int idElectricalDevice){
struct Locality * localityX = searchL(idLocality);
int monthlyConsumption;
if (localityX == NULL){
cout<<"\nThe Locality doesn't exist...\n";
return ;
}else{
monthlyConsumption = recursiveTraversal(idLocality , localityX -> firstH, NULL, idElectricalDevice);
cout<<"Monthly Consumption: "<<monthlyConsumption;
}
}
这里是函数的代码,问题是比如我给homeToRome节点赋值的时候,我把localityX -> firstH写到参数里,再放到递归函数里,感觉一样,赋值每个节点的第一个节点的子列表。
增加线
return 0 + (recursiveTraversal(idLocality, homeToRoam, intakeToRoam -> next, idElectricalDevice));
但是当我在递归调用中将 intakeToRoam 增加到下一个节点时,它设置相同。
即使我打印值 memory,intakeToRoam 与 intakeToRoam -> next 相比也是不同的值。
非常感谢您,感谢您的帮助!
你有无限递归,因为你总是用这行重置 intakeToRoam
:
intakeToRoam = homeToRoam->firstI;
如果删除此行,您现在会遇到识别迭代 intakeToRoam
列表的开始和结束的问题。解决此问题的最简单方法是保留 NULL
intakeToRoam
表示开始迭代并手动检查函数中列表的末尾,例如:
int recursiveTraversal(int idLocality, struct Home *homeToRoam, struct Intake *intakeToRoam, int idElectricalDevice){
if (homeToRoam == NULL)
return 0;
else {
if (intakeToRoam == NULL)
return 0 + (recursiveTraversal(idLocality, homeToRoam, homeToRoam->firstI, idElectricalDevice));
else {
struct electricalDevices * temp = searchED(idLocality, homeToRoam -> code, intakeToRoam -> id, idElectricalDevice);
int consumption = 0;
if (temp != NULL) consumption = temp -> intakeEnergyPerHour;
if (intakeToRoam->next != NULL)
return consumption + recursiveTraversal(idLocality, homeToRoam, intakeToRoam -> next, idElectricalDevice);
else
return consumption + recursiveTraversal(idLocality, homeToRoam->next, NULL, idElectricalDevice);
}
}
}