C#函数局部递归

函数局部递归,使用Lambda表达式,将函数本身当作参数传递给本身

     public delegate Func<XmlNode,Cali> Group_Parameter_Del(Group_Parameter_Del self);
        private void UpdateCalibration(ref Calibration_Version calibration_Version,string path)
        {
            XmlDocument xmlDTC = new XmlDocument();
            xmlDTC.Load(path);    //加载Xml文件  
            XmlElement rootElem = xmlDTC.DocumentElement;   //获取根节点  
            XmlNodeList versionNodes = rootElem.GetElementsByTagName("Version");
            if (versionNodes != null)
            {
                foreach (XmlNode versionItem in versionNodes)
                {
                    calibration_Version.Version = versionItem.Attributes["version"].InnerText;
                    calibration_Version.Calibrations = new List<Calibration>();
                    foreach (XmlNode cali_Item in versionItem.ChildNodes)
                    {
                        Calibration tempCalibration = new Calibration();
                        tempCalibration.Model = cali_Item.Attributes["module"].InnerText;
                        tempCalibration.CalibrationFuctions = new List<Calibration_Fuction>();
                        foreach (XmlNode fun_Item in cali_Item)
                        {
                            Calibration_Fuction tempFunc = new Calibration_Fuction();
                            tempFunc.Name = fun_Item.Attributes["name"].InnerText;
                            tempFunc.CalibrationGroup = new List<Calibration_Group>();
                 //匿名函数实现,实际上相当于在函数内部声明并实现一个匿名函数
                            Group_Parameter_Del del = (Group_Parameter_Del _del) => (XmlNode tempNode) =>
                            {
                                if (tempNode.Name == "Group")
                                {
                                    Calibration_Group tempGroup = new Calibration_Group();
                                    tempGroup.GroupName = tempNode.Attributes["name"].InnerText;
                                    tempGroup.CalibrationParameters = new List<Calibration_Parameters>();
                                    foreach (XmlNode item in tempNode)
                                    {
                                        if(item.Name== "Parameters")
                                        {
                                            tempGroup.CalibrationParameters.Add(_del(_del)(item) as Calibration_Parameters);//调用自身
                                        }
                                    }
                                    return tempGroup;
                                }
                                else//Parameters
                                {
                                    Calibration_Parameters tempParameter = new Calibration_Parameters();
                                    tempParameter.Type = tempNode.Attributes["type"].InnerText;
                                    tempParameter.CalibrationGroup = new List<Calibration_Group>();
                                    tempParameter.CalibrationParameter = new List<Calibration_Parameter>();
                                    foreach (XmlNode item in tempNode)
                                    {
                                        if (item.Name == "Parameter")//递归到最底层
                                        {
                                            Calibration_Parameter tempParam = new Calibration_Parameter();
                                            tempParam.Name = item.Attributes["name"].InnerText;
                                            tempParameter.CalibrationParameter.Add(tempParam);
                                        }
                                        else//group
                                        {
                                            if(item.Name == "Group")
                                            {
                                                tempParameter.CalibrationGroup.Add(_del(_del)(item) as Calibration_Group);//调用自身
                                            }
                                        }
                                    }
                                    return tempParameter;
                                }
                            };
                            foreach (XmlNode item in fun_Item)//遍历group
                            {
                                tempFunc.CalibrationGroup.Add(del(del)(item)  as Calibration_Group);//调用匿名递归函数
                            }
                            tempCalibration.CalibrationFuctions.Add(tempFunc);
                        }
                        calibration_Version.Calibrations.Add(tempCalibration);
                    }
                }
            }
        }

另在附简单代码

delegate Func<int, int> F(F self);

F fac = (F f) => (int n) => n == 1 ? 1 : n * f(f)(n - 1);

fac(fac)(5)

 

posted @ 2020-11-25 10:34  橘猫不太胖  阅读(70)  评论(0)    收藏  举报