本文目錄一覽:
關於java中的遞歸
hi(n
+
1);
System.out.println(“你好”
+
n);
這兩句調換一下,就不會反了。
因為最後一個遞歸調用最先返回,而第一次列印就是在這個返回之後調用的。
執行過程:
main-hi(1)-hi(2)-hi(3)…hi(20)。
hi(19):
hi(20)返回,
print(19).
返回
hi(18):
hi(19)返回,
print(18).
返回
…
hi(1):hi(2)返回,print(1).返回
main:
下一句,退出.
遞歸只重複函數的內容。
如果是非引用型參數,其值在遞歸返回後不會受影響。這個跟普通的函數調用沒有區別。
但是,遞歸需要注意兩個基本問題:
1)
必須要有終止條件。
2)
遞歸層次不能太深,否則可能引起調用棧溢出,導致程序崩潰。
在JAVA中什麼是遞歸?有什麼用?
Java方法遞歸是指在一個方法的內部調用自身的過程,以此類推就是java方法遞歸的理解思想,具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函數實現時,因為解決大問題的方法和解決小問題的方法往往是同一個方法,所以就產生了函數調用它自身的情況。另外這個解決問題的函數必須有明顯的結束條件,這樣就不會產生無限遞歸的情況了。因此,java方法遞歸的兩個條件就是,一通過遞歸調用來縮小問題規模,且新問題與原問題有著相同的形式;二存在一種簡單情境,可以使遞歸在簡單情境下退出。
java遞歸如何理解
可以理解為遞歸,就是自己調用自己而已.每個遞歸都有一個結束條件.這個遞歸的結束條件就是a==1;
當a==1的時候,終止遞歸,return 1.這個 1 給上一層調用者.也即是 plus(2)
簡單的說可以理解為, plus(10)=plus(9)+10.
plus(9)=plus(8)+9
以此類推
plus(2)=plus(1)+2
plus(2)=1(plus(1),既a==1,遞歸結束,renturn 1)+2
java的遞歸查詢怎麼寫
原文在這裡,寫得不錯,樓主可參考下,具體鏈接如下,我只是搬運工!
/**
* 說明方法描述:將list轉為樹tree結構
*
* @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保存所有數據的uuid用於判斷是不是根節點
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找出所有的根節點和非根節點
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);
}
}
}
// 第三步: 遞歸獲取所有子節點
if (listParentRecord.size() 0) {
for (Record record : listParentRecord) {
// 添加所有子級
record.set(“childs”, this.getTreeChildRecord(listNotParentRecord, record.getStr(“uuid”)));
}
}
return listParentRecord;
}
/**
* 說明方法描述:使list轉換為樹並根據關鍵字和節點名稱過濾
*
* @param allRecords 所有節點
* @param keywords 要過濾的關鍵字
* @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和關鍵字keywords相關的數據
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);
}
}
}
}
// 查找過濾出來的節點和他們的父節點
listRecord = this.getSelfAndTheirParentRecord(listRecord, new ArrayListRecord(),
new HashMapString, Record(), allRecordMap);
// 將過濾出來的數據變成樹tree結構
listRecord = this.useListRecordToTree(listRecord);
return listRecord;
}
/**
* 說明方法描述:遞歸查詢子節點
*
* @param childList 子節點
* @param parentUuid 父節點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,找出所有的根節點和非根節點
if (childList != null childList.size() 0) {
for (Record record : childList) {
// 對比找出父節點
if (StringUtil.equals(record.getStr(“parent_uuid”), parentUuid)) {
listParentRecord.add(record);
} else {
listNotParentRecord.add(record);
}
}
}
// 查詢子節點
if (listParentRecord.size() 0) {
for (Record record : listParentRecord) {
// 遞歸查詢子節點
record.set(“childs”, getTreeChildRecord(listNotParentRecord, record.getStr(“uuid”)));
}
}
return listParentRecord;
}
/**
* 說明方法描述:遞歸找出本節點和他們的父節點
*
* @param parentList 根據關鍵字過濾出來的相關節點的父節點
* @param resultList 返回的過濾出來的節點
* @param filterRecordMap 已經過濾出來的節點
* @param allRecordMap 所有節點
* @return
* @time 2016年5月19日 上午9:53:56
* @author yangdong
*/
private ListRecord getSelfAndTheirParentRecord(ListRecord parentList, ListRecord resultList,
MapString, Record filterRecordMap,
MapString, Record allRecordMap) {
// 當父節點為null或者節點數量為0時返回結果,退出遞歸
if (parentList == null || parentList.size() == 0) {
return resultList;
}
// 重新創建父節點集合
ListRecord listParentRecord = new ArrayListRecord();
// 遍歷已經過濾出來的節點
for (Record record : parentList) {
String uuid = record.getStr(“uuid”);
String parent_uuid = record.getStr(“parent_uuid”);
// 如果已經過濾出來的節點不存在則添加到list中
if (!filterRecordMap.containsKey(uuid)) {
listParentRecord.add(record);// 添加到父節點中
filterRecordMap.put(uuid, record);// 添加到已過濾的map中
allRecordMap.remove(uuid);// 移除集合中相應的元素
resultList.add(record);// 添加到結果集中
}
// 找出本節點的父節點並添加到listParentRecord父節點集合中,並移除集合中相應的元素
if (StringUtil.isNotBlank(parent_uuid)) {
Record parentRecord = allRecordMap.get(parent_uuid);
if (parentRecord != null) {
listParentRecord.add(parentRecord);
allRecordMap.remove(parent_uuid);
}
}
}
// 遞歸調用
getSelfAndTheirParentRecord(listParentRecord, resultList, filterRecordMap, allRecordMap);
return resultList;
}
[java] view plain copy
//示例
[java] view plain copy
/**
* 說明方法描述:遞歸查詢所有許可權
*
* @param keyword
* @param is_deleted
* @return
* @time 2016年5月10日 下午3:47:50
* @author yangdong
*/
public ListRecord getRecordByKeywordRecursive(String keyword, String is_deleted) {
// 第一步:查詢所有的數據
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變為樹tree結構
if (StringUtil.isNotBlank(keyword)) {
return super.useListRecordToTreeByKeywords(allRrecords, keyword, “author_name”);
} else {
return super.useListRecordToTree(allRrecords);
}
}
JAVA如何理解遞歸
1、遞歸做為一種演算法在程序設計語言中廣泛使用,是指函數/過程/子程序在運行過程中直接或間接調用自身而產生的重入現象。
2、遞歸演算法一般用於解決三類問題:
1)數據的定義是按遞歸定義的。(Fibonacci(斐波那契)的函數)
2)問題解法按遞歸演算法實現。(回溯)
3)數據的結構形式是按遞歸定義的。(樹的遍歷,圖的搜索)
原創文章,作者:HBIY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/139098.html