日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 递归层级拼接_使用递归方法拼接层级树

發(fā)布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 递归层级拼接_使用递归方法拼接层级树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

遞歸算法這個是非常常見的一個算法,也是大多數(shù)人都會用的,因為它足夠簡單,通俗易懂!在遍歷城市,樹等大腦里反應出來的第一方法大多就屬于這個了

遞歸容易使用,但是也容易用壞,我想"內(nèi)存溢出"這個估計是每個人用遞歸都會碰到的bug,我為什么還是要寫這方面的知識呢,那是因為文章的最后我有一個問題要問

首先我先展示我之前寫的一段遞歸拼接層級樹的代碼:

private string ParentColumns(List columns, intid)

{using(msdb)

{var parents = columns.Where(p => p.parentid ==id).ToList();

StringBuilder sb= newStringBuilder();if (parents.Count > 0)

{

parents.ForEach(item=>{

sb.AppendFormat("

{0}{1}{2} ", item.cl_id, item.cl_px, item.cl_name);

sb.Append(ChildColumns(columns, item.cl_id,2));

});//釋放內(nèi)存

parents = null;

}returnsb.ToString();

}

}

private string ChildColumns(List columns, int cl_id, intsub)

{var childs = columns.Where(p => p.parentid ==cl_id).ToList();

StringBuilder sb= newStringBuilder();if (childs.Count > 0)

{string substag = "";for (int i = 0; i < sub; i++)

{

substag+= "—";

}

childs.ForEach(item=>{

sb.AppendFormat("

{0}{1}{3}{2} ", item.cl_id, item.cl_px, item.cl_name, substag);

sb.Append(ChildColumns(columns, item.cl_id,2 *sub));

});

childs= null;

}returnsb.ToString();

}

這代碼是我修復過的,之前報內(nèi)存溢出的代碼我就不貼了,無非就是我引用了靜態(tài)變量list以及StringBuilder類,所以遞歸的時候,內(nèi)存得不到有效釋放,最后就瀑黃頁了。

那么這個bug的本質(zhì)我說一下:因為線程在運行函數(shù),都會分配一定的內(nèi)存(??臻g)給它,如方法的參數(shù),變量,返回值等!而這個方法又在不斷的調(diào)用自身,所以深度大了,其內(nèi)存又得不到釋放,就超出異常了!所以我這里用靜態(tài)變量就顯得“助紂為虐”了

那么,問題就來了,如果根據(jù)老趙的尾遞歸與Continuation一問中的描述,那我也可以改造成堆內(nèi)存不造成影響的“尾遞歸”形式,我只要用accStr來記錄上一次累加的字符串當作參數(shù)傳遞,于是就有了下面這段異常難看的代碼

private string ChildColumnsRecursively(List columns, int cl_id, int sub,stringaccStr)

{var childs = columns.Where(p => p.parentid == cl_id).Select(p => new { id = p.cl_id, oid = p.cl_px, name =p.cl_name }).ToList();

StringBuilder sb= newStringBuilder();if (childs.Count > 0)

{string substag = "";for (int i = 0; i < sub; i++)

{

substag+= "—";

}

childs.ForEach(item=>{

sb.AppendFormat("

{0}{1}{3}{2} ", item.id, item.oid, item.name, substag);

accStr+= ChildColumnsRecursively(columns, item.id, 2 *sub, sb.ToString());

});

childs= null;

sb.Append(accStr);

}returnsb.ToString();

}

這怎么看怎么不是尾遞歸,連“偽遞歸”都談不上

我心中的改造形式應該是像下面這樣的偽代碼:

public string ChildColumnsRecursively(List columns,int id,stringaccStr){

...Logic Code

accStr=values;returnChildColumnsRecursively(columns,pid,accStr);

}

看老趙的博客,感覺看懂了,但是我想用到我這個案例上,卻又感覺差點東西,不知道那方面還沒理解到位...先擱這吧,以后再慢慢想解決方案

總結(jié)

以上是生活随笔為你收集整理的java 递归层级拼接_使用递归方法拼接层级树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。