递归小记
来自实际遇到的一个问题,需要查找出根节点的下的所有子节点,首先想到的就是递归了,用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,麻烦的不行。当然,用递归也不能瞎用,要控制好进行递归的条件,不然很容易导致死循环的出现(这可是会卡死程序的,所以用的时候要慎用)。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Python高级知识点学习(三)
mro算法 类属性和实例属性的查找顺序 何为类属性:定义在类内部的的一些变量或者方法,都统称为类属性 何为实例属性:定义在对象内部的的一些变量或者方法,都统称为实例属性 对象也就是实例的意思。 class A: aa = 1 def __init__(self, x, y): self.x = x self.y = y a = A(2, 3) 类也是对象,看上边代码,实际上有两个空间,A 和 a 两个不同的空间。单继承时,属性查找方式,向上查找,首先查找对象里,再查找类中 在多继承时,会很复杂 python2.2之前,python里的类叫经典类,经典类继承方式如果不显式继承object,实际上是不会自动继承object,Python3中,经典类已经不存在了,都叫做新式类。经典类中,深度优先查找 。 Python2.3之后,广度优先也没有了,至今都采用C3算法Python3多重继承C3算法: #新式类 class D: pass class E: pass class C(E): pass class B(D): pass class A(B, C): pass print(A.__mr...
-
下一篇
Linux7安装tomcat8
打开tomcat官网下载https://tomcat.apache.org/download-80.cgi[root@jiaxin-ceshi local]# cd /usr/local/src/[root@jiaxin-ceshi src]# wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.53/bin/apache-tomcat-8.0.53.tar.gz[root@jiaxin-ceshi src]# tar xf apache-tomcat-8.0.53.tar.gz [root@jiaxin-ceshi src]# cd apache-tomcat-8.0.53[root@jiaxin-ceshi apache-tomcat-8.0.53]# ./bin/startup.sh 报错 没有安装jDK现在去下载jdkjdk官网https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html[root@jiaxi...
相关文章
文章评论
共有0条评论来说两句吧...

微信收款码
支付宝收款码