尽管有停止条件,仍会执行无限递归调用,因为参数不会前进

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