递归小记

简介:     来自实际遇到的一个问题,需要查找出根节点的下的所有子节点,首先想到的就是递归了,用JS写过,C#之前写了一次没写对,这次专门用心看了一下的,发现和ref关键字有关,写贴上源码:      public static void InsertCmsTypeName(int typeid,...

    来自实际遇到的一个问题,需要查找出根节点的下的所有子节点,首先想到的就是递归了,用JS写过,C#之前写了一次没写对,这次专门用心看了一下的,发现和ref关键字有关,写贴上源码:

    

public static void InsertCmsTypeName(int typeid, ref List<string> cacheNameList)
{
    string name = string.Empty;
    List<TB_CMSType> cts = CMS.GetCmsTypeForParentID(typeid);
    if (cts != null && cts.Count > 0)
    {
        foreach (TB_CMSType item in cts)
        {
            name = "GetSpecialProducts" + item.ID + Config.SiteID; 
            cacheNameList.Add(name);
            InsertCmsTypeName(item.ID, ref cacheNameList);
        }
    }
}

    typeid是节点id,第一次是根节点,往后就是当前节点下的子节点了。cacheNameList是存储数据的集合,类型名称前面用了ref修饰。

    为什么呢,这里就涉及到一个概念了,值传递!InsertCmsTypeName方法里每次对集合做add操作的时候,cacheNameList的数组个数都会新增。

    

    List<string> cacheNameList = new List<string>();
    Base.InsertCmsTypeName(4106, ref cacheNameList);

    可以很明显的看到,InsertCmsTypeName方法是没有返回值的, 那么如何保持递归方法里cacheNameList的值呢,ref 就出来了,ref使参数的传递方式变成了值传递,每次参数指向的是内存里的首地址,这样每次修改这个值的时候,它本身就修改了。一般的参数传递是引用传递,就是说在传递参数的时候,参数的本身不会被修改,而通过ref修饰过的参数,传递方式变成值传递,每次方法内部修改这个参数的时候,参数的本身也会被修改,所以,InsertCmsTypeName无需返回值。

    之前用C#写递归的时候就是没注意到这个,导致递归方法执行了,最后的结果还是没有 (*/ω\*) 这里记下笔记还是有必要的。

    

    另,算法真的很重要鸭,要是不会写递归,这种通过根节点找出所有子节点的问题,怕是要写for循环了,而且就算是for循环也不能根本性解决问题,只能预测最多有多少层,然后写多少个for,麻烦的不行。当然,用递归也不能瞎用,要控制好进行递归的条件,不然很容易导致死循环的出现(这可是会卡死程序的,所以用的时候要慎用)。

 

目录
相关文章
|
8月前
|
数据采集 存储 搜索推荐
从零开始搭建埋点采集体系:轻松解锁用户行为分析
埋点技术因其高精度和定制化能力,成为许多公司的首选方式。然而,有些公司在埋点采集时,将其视为开发过程中的“附加任务”,让研发人员在开发过程中顺带加上一些埋点,而没有完整的规划和验证。这往往导致数据分析的效果不尽如人意。为了避免这种情况,我们需要将数据采集提升到项目级别,进行系统化的规划和实施。
从零开始搭建埋点采集体系:轻松解锁用户行为分析
|
Kubernetes jenkins 测试技术
Jenkins,持续交付的利器:揭秘插件生态系统(二)
Jenkins,持续交付的利器:揭秘插件生态系统
|
分布式计算 DataWorks 大数据
实时计算Flink版体验评测
阿里云实时计算Flink版提供详尽的引导和文档,包括用户手册、快速入门指南及API文档,助力新手快速上手。其Web控制台界面友好,支持数据开发、调试、运行与监控一站式解决方案,内置强大的CDC功能和企业级CEP支持。然而,在高级功能示例、定制化模板、智能调优及跨云支持方面仍有改进空间。作为阿里云大数据生态的一部分,它与MaxCompute和DataWorks紧密联动,可构建高效的数据处理体系。总体而言,该产品在功能丰富性、易用性和性能稳定性方面表现出色,有望在未来大数据实时处理领域发挥重要作用。
|
前端开发 JavaScript Java
Apache Wicket 框架:踏上从新手到英雄的逆袭之路,成就你的编程传奇!
【9月更文挑战第4天】Apache Wicket是一款基于Java的开源Web应用框架,以简洁、易维护及强大功能著称。它采用组件化设计,让页面开发更为模块化。Wicket的简洁编程模型、丰富的组件库、良好的可维护性以及对Ajax的支持,使其成为高效开发Web应用的理想选择。下文将通过解析Wicket的基本概念与特性,帮助读者深入了解这一框架的优势。
569 1
|
存储 算法 C++
C++ STL精通之旅:向量、集合与映射等容器详解
C++ STL精通之旅:向量、集合与映射等容器详解
382 0
|
Java
Java实现1.指定关键字搜索 2.指定后缀名搜索 3.文件/文件夹复制
Java实现1.指定关键字搜索 2.指定后缀名搜索 3.文件/文件夹复制
89 1
|
算法
【计组】32位浮点数的表示范围以及如何解决精度缺失
【计组】32位浮点数的表示范围以及如何解决精度缺失
1068 0
【计组】32位浮点数的表示范围以及如何解决精度缺失
|
Ubuntu 开发工具 C语言
EPICS的下载与安装
主要讲述的是EPICS的下载安装
680 1
|
JavaScript 调度
万界星空科技MES与WMS如何集成的?
传统制造业数字化转型正汹涌而来,要进一步提高产业发展质量,重塑制造业竞争优势,就必须加快发展数字化制造,加紧推动制造业的数字化转型。
303 0
|
弹性计算 大数据 测试技术
惊喜不断:阿里云服务器多少钱一年?价格表新鲜出炉
惊喜不断:阿里云服务器多少钱一年?价格表新鲜出炉,CPU内存配置可选2核2G、2核4G、2核8G、2核16G、4核4G、4核8G、4核16G、4核32G、8核8G、8核16G、8核32G、8核64G等配置,云服务器包括轻量应用服务器和云服务器ECS,ECS实例可选通用算力型u1、计算型c7、通用型g7和内存型r7实例
259 0
下一篇
oss云网关配置