使用遞歸計(jì)算5的階乘,遞歸代碼的書寫得找出原問題兩個(gè)顯著的特點(diǎn),1.上一層與下一層之間的關(guān)系,或者公式。2.跳出遞歸的條件。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了永安免費(fèi)建站歡迎大家使用!
階乘:0!=1,1!=1,2!=1!*2,3!=2!*3,4!=4*3!,5!=5*4!。由這6個(gè)式子我們可知,求5的階乘,得求4的階乘,求4的階乘必須先求3的階乘,以此類推。故,什么時(shí)候才能停止往下(繼續(xù)往下找呢),我們只0!=1,這就是跳出遞歸的條件,這是固定的。上下層之間的關(guān)系,5!=4!*5,假設(shè)n=5,那么用未知數(shù)可表示n!=(n-1)!*n。具體代碼如下。
public
class
Test
{
public
static
void
main(String[]
args)
{
int
num=fac(5);
System.out.println(num);
}
public
static
int
fac(int
n){
if(n==1){//跳出遞歸的條件:0!=1
return
1;
}else{
int
num=n*fac(n-1);//上下層的關(guān)系:n!=(n-1)!*n
return
num;
}
}
自己調(diào)用自己或幾個(gè)方法相互調(diào)用。
最經(jīng)典的是求正整數(shù)階的算法:
int fact(int i){
if(i=1)return 1;
return fact(i-1)*i;
}
多數(shù)遞歸方法可以轉(zhuǎn)換成非遞歸方法。
一般同功能的非遞歸方法,執(zhí)行效率要優(yōu)于遞歸方法。但合理的使用遞歸方法,可以使代碼結(jié)構(gòu)更清晰,更有可讀性,從而更方便維護(hù)。
Java是一種可以撰寫跨平臺(tái)應(yīng)用程序的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。Java?技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。
1、遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛使用,是指函數(shù)/過程/子程序在運(yùn)行過程中直接或間接調(diào)用自身而產(chǎn)生的重入現(xiàn)象。
2、遞歸算法一般用于解決三類問題:
1)數(shù)據(jù)的定義是按遞歸定義的。(Fibonacci(斐波那契)的函數(shù))
2)問題解法按遞歸算法實(shí)現(xiàn)。(回溯)
3)數(shù)據(jù)的結(jié)構(gòu)形式是按遞歸定義的。(樹的遍歷,圖的搜索)
原文在這里,寫得不錯(cuò),樓主可參考下,具體鏈接如下,我只是搬運(yùn)工!
/**?
*?說明方法描述:將list轉(zhuǎn)為樹tree結(jié)構(gòu)?
*??
*?@param?allRrecords?
*?@return?
*?@time?2016年5月10日?下午6:00:35?
*?@author?yangdong?
*/??
public?ListRecord?useListRecordToTree(ListRecord?allRrecords)?{??
ListRecord?listParentRecord?=?new?ArrayListRecord();??
ListRecord?listNotParentRecord?=?new?ArrayListRecord();??
//?第一步:遍歷allRrecords保存所有數(shù)據(jù)的uuid用于判斷是不是根節(jié)點(diǎn)??
MapString,?String?mapAllUuid?=?new?HashMapString,?String();??
MapString,?Record?allRecordMap?=?new?HashMapString,?Record();??
for?(Record?record?:?allRrecords)?{??
mapAllUuid.put(record.getStr("uuid"),?record.getStr("uuid"));??
allRecordMap.put(record.getStr("uuid"),?record);??
}??
//?第二步:遍歷allRrecords找出所有的根節(jié)點(diǎn)和非根節(jié)點(diǎn)??
if?(allRrecords?!=?null??allRrecords.size()??0)?{??
for?(Record?record?:?allRrecords)?{??
if?(StringUtil.isBlank(record.getStr("parent_uuid"))??
||?!mapAllUuid.containsKey(record.getStr("parent_uuid")))?{??
listParentRecord.add(record);??
}?else?{??
listNotParentRecord.add(record);??
}??
}??
}??
//?第三步:?遞歸獲取所有子節(jié)點(diǎn)??
if?(listParentRecord.size()??0)?{??
for?(Record?record?:?listParentRecord)?{??
//?添加所有子級??
record.set("childs",?this.getTreeChildRecord(listNotParentRecord,?record.getStr("uuid")));??
}??
}??
return?listParentRecord;??
}??
/**?
*?說明方法描述:使list轉(zhuǎn)換為樹并根據(jù)關(guān)鍵字和節(jié)點(diǎn)名稱過濾?
*??
*?@param?allRecords?所有節(jié)點(diǎn)?
*?@param?keywords?要過濾的關(guān)鍵字?
*?@param?filterFields?要過濾的字段?
*?@return?
*?@time?2016年5月19日?下午3:27:32?
*?@author?yangdong?
*/??
public?ListRecord?useListRecordToTreeByKeywords(ListRecord?allRecords,?String?keywords,?String...?filterFields)?{??
ListRecord?listRecord?=?new?ArrayListRecord();??
MapString,?Record?allRecordMap?=?new?HashMapString,?Record();??
for?(Record?record?:?allRecords)?{??
allRecordMap.put(record.getStr("uuid"),?record);??
}??
//?遍歷allRrecords找出所有的nodeName和關(guān)鍵字keywords相關(guān)的數(shù)據(jù)??
if?(allRecords?!=?null??allRecords.size()??0)?{??
if?(filterFields.length??1)?{??
for?(Record?record?:?allRecords)?{??
for?(String?field?:?filterFields)?{??
//?比較??
if?(record.getStr(field).toLowerCase().indexOf(keywords.toLowerCase())?!=?-1)?{??
listRecord.add(record);??
}??
}??
}??
}?else?{??
for?(Record?record?:?allRecords)?{??
//?比較??
if?(record.getStr(filterFields[0]).toLowerCase().indexOf(keywords.toLowerCase())?!=?-1)?{??
listRecord.add(record);??
}??
}??
}??
}??
//?查找過濾出來的節(jié)點(diǎn)和他們的父節(jié)點(diǎn)??
listRecord?=?this.getSelfAndTheirParentRecord(listRecord,?new?ArrayListRecord(),??
new?HashMapString,?Record(),?allRecordMap);??
//?將過濾出來的數(shù)據(jù)變成樹tree結(jié)構(gòu)??
listRecord?=?this.useListRecordToTree(listRecord);??
return?listRecord;??
}??
/**?
*?說明方法描述:遞歸查詢子節(jié)點(diǎn)?
*??
*?@param?childList?子節(jié)點(diǎn)?
*?@param?parentUuid?父節(jié)點(diǎn)id?
*?@return?
*?@time?2016年5月10日?下午3:29:35?
*?@author?yangdong?
*/??
private?ListRecord?getTreeChildRecord(ListRecord?childList,?String?parentUuid)?{??
ListRecord?listParentRecord?=?new?ArrayListRecord();??
ListRecord?listNotParentRecord?=?new?ArrayListRecord();??
//?遍歷tmpList,找出所有的根節(jié)點(diǎn)和非根節(jié)點(diǎn)??
if?(childList?!=?null??childList.size()??0)?{??
for?(Record?record?:?childList)?{??
//?對比找出父節(jié)點(diǎn)??
if?(StringUtil.equals(record.getStr("parent_uuid"),?parentUuid))?{??
listParentRecord.add(record);??
}?else?{??
listNotParentRecord.add(record);??
}??
}??
}??
//?查詢子節(jié)點(diǎn)??
if?(listParentRecord.size()??0)?{??
for?(Record?record?:?listParentRecord)?{??
//?遞歸查詢子節(jié)點(diǎn)??
record.set("childs",?getTreeChildRecord(listNotParentRecord,?record.getStr("uuid")));??
}??
}??
return?listParentRecord;??
}??
/**?
*?說明方法描述:遞歸找出本節(jié)點(diǎn)和他們的父節(jié)點(diǎn)?
*??
*?@param?parentList?根據(jù)關(guān)鍵字過濾出來的相關(guān)節(jié)點(diǎn)的父節(jié)點(diǎn)?
*?@param?resultList?返回的過濾出來的節(jié)點(diǎn)?
*?@param?filterRecordMap?已經(jīng)過濾出來的節(jié)點(diǎn)?
*?@param?allRecordMap?所有節(jié)點(diǎn)?
*?@return?
*?@time?2016年5月19日?上午9:53:56?
*?@author?yangdong?
*/??
private?ListRecord?getSelfAndTheirParentRecord(ListRecord?parentList,?ListRecord?resultList,??
MapString,?Record?filterRecordMap,??
MapString,?Record?allRecordMap)?{??
//?當(dāng)父節(jié)點(diǎn)為null或者節(jié)點(diǎn)數(shù)量為0時(shí)返回結(jié)果,退出遞歸??
if?(parentList?==?null?||?parentList.size()?==?0)?{??
return?resultList;??
}??
//?重新創(chuàng)建父節(jié)點(diǎn)集合??
ListRecord?listParentRecord?=?new?ArrayListRecord();??
//?遍歷已經(jīng)過濾出來的節(jié)點(diǎn)??
for?(Record?record?:?parentList)?{??
String?uuid?=?record.getStr("uuid");??
String?parent_uuid?=?record.getStr("parent_uuid");??
//?如果已經(jīng)過濾出來的節(jié)點(diǎn)不存在則添加到list中??
if?(!filterRecordMap.containsKey(uuid))?{??
listParentRecord.add(record);//?添加到父節(jié)點(diǎn)中??
filterRecordMap.put(uuid,?record);//?添加到已過濾的map中??
allRecordMap.remove(uuid);//?移除集合中相應(yīng)的元素??
resultList.add(record);//?添加到結(jié)果集中??
}??
//?找出本節(jié)點(diǎn)的父節(jié)點(diǎn)并添加到listParentRecord父節(jié)點(diǎn)集合中,并移除集合中相應(yīng)的元素??
if?(StringUtil.isNotBlank(parent_uuid))?{??
Record?parentRecord?=?allRecordMap.get(parent_uuid);??
if?(parentRecord?!=?null)?{??
listParentRecord.add(parentRecord);??
allRecordMap.remove(parent_uuid);??
}??
}??
}??
//?遞歸調(diào)用??
getSelfAndTheirParentRecord(listParentRecord,?resultList,?filterRecordMap,?allRecordMap);??
return?resultList;??
}??
[java]?view?plain?copy
//示例??
[java]?view?plain?copy
/**?
*?說明方法描述:遞歸查詢所有權(quán)限?
*??
*?@param?keyword?
*?@param?is_deleted?
*?@return?
*?@time?2016年5月10日?下午3:47:50?
*?@author?yangdong?
*/??
public?ListRecord?getRecordByKeywordRecursive(String?keyword,?String?is_deleted)?{??
//?第一步:查詢所有的數(shù)據(jù)??
StringBuffer?sql?=?new?StringBuffer(??
"?select?pa.uuid,pa.parent_uuid,pa.author_code,pa.author_name,pa.is_menu,pa.sort_number,pa.is_enable,pa.menu_icon?");??
sql.append("??from?s_author?pa");??
ListObject?params?=?new?ArrayListObject();??
sql.append("?where??pa.is_deleted=??");??
params.add(is_deleted);??
sql.append("?order?by?pa.sort_number?asc?");??
ListRecord?allRrecords?=?Db.use(AppConst.DB_DATASOURCE_MAIN).find(sql.toString(),?ParamUtil.listToArray(params));??
[java]?view?plain?copy
//第二步:將list變?yōu)闃鋞ree結(jié)構(gòu)??
if?(StringUtil.isNotBlank(keyword))?{??
return?super.useListRecordToTreeByKeywords(allRrecords,?keyword,?"author_name");??
}?else?{??
return?super.useListRecordToTree(allRrecords);??
}??
}
文章名稱:java代碼如何書寫遞歸 java遞歸簡單例子
網(wǎng)站路徑:http://muchs.cn/article42/doecchc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、微信小程序、響應(yīng)式網(wǎng)站、全網(wǎng)營銷推廣、商城網(wǎng)站、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)