java遞歸怎麼寫
A. 用java遞歸方法實現
publicintfun(intn){
if(n==0||n==1)return1;
returnn*fun(n-1);
}
B. java的遞歸查詢怎麼寫
原文在這里,寫得不錯,樓主可參考下,具體鏈接如下,我只是搬運工!
http://blog.csdn.net/u011627980/article/details/51454323
/**
*說明方法描述:將list轉為樹tree結構
*
*@paramallRrecords
*@return
*@time2016年5月10日下午6:00:35
*@authoryangdong
*/
publicList<Record>useListRecordToTree(List<Record>allRrecords){
List<Record>listParentRecord=newArrayList<Record>();
List<Record>listNotParentRecord=newArrayList<Record>();
//第一步:遍歷allRrecords保存所有數據的uuid用於判斷是不是根節點
Map<String,String>mapAllUuid=newHashMap<String,String>();
Map<String,Record>allRecordMap=newHashMap<String,Record>();
for(Recordrecord:allRrecords){
mapAllUuid.put(record.getStr("uuid"),record.getStr("uuid"));
allRecordMap.put(record.getStr("uuid"),record);
}
//第二步:遍歷allRrecords找出所有的根節點和非根節點
if(allRrecords!=null&&allRrecords.size()>0){
for(Recordrecord: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(Recordrecord:listParentRecord){
//添加所有子級
record.set("childs",this.getTreeChildRecord(listNotParentRecord,record.getStr("uuid")));
}
}
returnlistParentRecord;
}
/**
*說明方法描述:使list轉換為樹並根據關鍵字和節點名稱過濾
*
*@paramallRecords所有節點
*@paramkeywords要過濾的關鍵字
*@paramfilterFields要過濾的欄位
*@return
*@time2016年5月19日下午3:27:32
*@authoryangdong
*/
publicList<Record>useListRecordToTreeByKeywords(List<Record>allRecords,Stringkeywords,String...filterFields){
List<Record>listRecord=newArrayList<Record>();
Map<String,Record>allRecordMap=newHashMap<String,Record>();
for(Recordrecord:allRecords){
allRecordMap.put(record.getStr("uuid"),record);
}
//遍歷allRrecords找出所有的nodeName和關鍵字keywords相關的數據
if(allRecords!=null&&allRecords.size()>0){
if(filterFields.length>1){
for(Recordrecord:allRecords){
for(Stringfield:filterFields){
//比較
if(record.getStr(field).toLowerCase().indexOf(keywords.toLowerCase())!=-1){
listRecord.add(record);
}
}
}
}else{
for(Recordrecord:allRecords){
//比較
if(record.getStr(filterFields[0]).toLowerCase().indexOf(keywords.toLowerCase())!=-1){
listRecord.add(record);
}
}
}
}
//查找過濾出來的節點和他們的父節點
listRecord=this.getSelfAndTheirParentRecord(listRecord,newArrayList<Record>(),
newHashMap<String,Record>(),allRecordMap);
//將過濾出來的數據變成樹tree結構
listRecord=this.useListRecordToTree(listRecord);
returnlistRecord;
}
/**
*說明方法描述:遞歸查詢子節點
*
*@paramchildList子節點
*@paramparentUuid父節點id
*@return
*@time2016年5月10日下午3:29:35
*@authoryangdong
*/
privateList<Record>getTreeChildRecord(List<Record>childList,StringparentUuid){
List<Record>listParentRecord=newArrayList<Record>();
List<Record>listNotParentRecord=newArrayList<Record>();
//遍歷tmpList,找出所有的根節點和非根節點
if(childList!=null&&childList.size()>0){
for(Recordrecord:childList){
//對比找出父節點
if(StringUtil.equals(record.getStr("parent_uuid"),parentUuid)){
listParentRecord.add(record);
}else{
listNotParentRecord.add(record);
}
}
}
//查詢子節點
if(listParentRecord.size()>0){
for(Recordrecord:listParentRecord){
//遞歸查詢子節點
record.set("childs",getTreeChildRecord(listNotParentRecord,record.getStr("uuid")));
}
}
returnlistParentRecord;
}
/**
*說明方法描述:遞歸找出本節點和他們的父節點
*
*@paramparentList根據關鍵字過濾出來的相關節點的父節點
*@paramresultList返回的過濾出來的節點
*@paramfilterRecordMap已經過濾出來的節點
*@paramallRecordMap所有節點
*@return
*@time2016年5月19日上午9:53:56
*@authoryangdong
*/
privateList<Record>getSelfAndTheirParentRecord(List<Record>parentList,List<Record>resultList,
Map<String,Record>filterRecordMap,
Map<String,Record>allRecordMap){
//當父節點為null或者節點數量為0時返回結果,退出遞歸
if(parentList==null||parentList.size()==0){
returnresultList;
}
//重新創建父節點集合
List<Record>listParentRecord=newArrayList<Record>();
//遍歷已經過濾出來的節點
for(Recordrecord:parentList){
Stringuuid=record.getStr("uuid");
Stringparent_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)){
RecordparentRecord=allRecordMap.get(parent_uuid);
if(parentRecord!=null){
listParentRecord.add(parentRecord);
allRecordMap.remove(parent_uuid);
}
}
}
//遞歸調用
getSelfAndTheirParentRecord(listParentRecord,resultList,filterRecordMap,allRecordMap);
returnresultList;
}
[java]viewplain
//示例
[java]viewplain
/**
*說明方法描述:遞歸查詢所有許可權
*
*@paramkeyword
*@paramis_deleted
*@return
*@time2016年5月10日下午3:47:50
*@authoryangdong
*/
publicList<Record>getRecordByKeywordRecursive(Stringkeyword,Stringis_deleted){
//第一步:查詢所有的數據
StringBuffersql=newStringBuffer(
"selectpa.uuid,pa.parent_uuid,pa.author_code,pa.author_name,pa.is_menu,pa.sort_number,pa.is_enable,pa.menu_icon");
sql.append("froms_authorpa");
List<Object>params=newArrayList<Object>();
sql.append("wherepa.is_deleted=?");
params.add(is_deleted);
sql.append("orderbypa.sort_numberasc");
List<Record>allRrecords=Db.use(AppConst.DB_DATASOURCE_MAIN).find(sql.toString(),ParamUtil.listToArray(params));
[java]viewplain
//第二步:將list變為樹tree結構
if(StringUtil.isNotBlank(keyword)){
returnsuper.useListRecordToTreeByKeywords(allRrecords,keyword,"author_name");
}else{
returnsuper.useListRecordToTree(allRrecords);
}
}
C. JAVA中的遞歸方法,求講一下。
自己調用自己或幾個方法相互調用。
最經典的是求正整數階的演算法:
int fact(int i){
if(i<=1)return 1;
return fact(i-1)*i;
}
多數遞歸方法可以轉換成非遞歸方法。
一般同功能的非遞歸方法,執行效率要優於遞歸方法。但合理的使用遞歸方法,可以使代碼結構更清晰,更有可讀性,從而更方便維護。
D. 在JAVA中什麼是遞歸有什麼用
Java方法遞歸是指在一個方法的內部調用自身的過程,以此類推就是java方法遞歸的理解思想,具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函數實現時,因為解決大問題的方法和解決小問題的方法往往是同一個方法,所以就產生了函數調用它自身的情況。另外這個解決問題的函數必須有明顯的結束條件,這樣就不會產生無限遞歸的情況了。因此,java方法遞歸的兩個條件就是,一通過遞歸調用來縮小問題規模,且新問題與原問題有著相同的形式;二存在一種簡單情境,可以使遞歸在簡單情境下退出。
E. Java遞歸寫一個從10減到0的程序,怎麼寫
遞歸需要做到兩個地方,第一明確應該在那個位置停止,第二:停止的條件是什麼.不然就會成為死循環,
int a=0;
int b=mi(a);
System.out.println(b);
public static int mi(int aa){
int count=0;
if(aa==0){
return 0;
}
if(count<2){
int i=mi(aa-1);
}
return aa-i;
}
F. java中的遞歸方法是怎麼樣的請舉例解析一下
自己調用自己或幾個方法相互調用。
最經典的是求正整數階的演算法:
int fact(int i){
if(i<=1)return 1;
return fact(i-1)*i;
}
多數遞歸方法可以轉換成非遞歸方法。
一般同功能的非遞歸方法,執行效率要優於遞歸方法。但合理的使用遞歸方法,可以使代碼結構更清晰,更有可讀性,從而更方便維護。
G. java遞歸怎麼寫31-32+33-34…+39
publicclassSpecialSum{
publicstaticvoidmain(String[]args){
System.out.println(sum(31,40));
}
publicstaticintsum(intstart,intend){
intsum=0;
if(start==end){
returnend%2==0?-1*end:end;
}
sum+=start%2==0?(-1*start):start;
returnsum+sum(start+1,end);
}
}
H. 求Java遞歸深入理解,比如循環裡面寫遞歸怎麼寫 求詳細教程
遞歸實際上就是函數調用自己本身。
比如算一個整數的階乘。傳入參數4,求出4*3*2*1結果。代碼如下:
public static int jiechen(int i)
{
if(i <= 1)
{
return 1;
}
else
{
return i*jiechen(i-1);
}
}
在這個函數中反復調用本身。
因為
jiechen(4) = 4*jiechen(3)
jiechen(3)=3*jiechen(2)
.....
遞歸的效率實際上並不高,不在不得已的情況下盡量不要遞歸
I. 什麼是遞歸,用Java怎麼實現
遞歸是函數調用自身,從而形成循環重復執行的現象。簡單的示例名稱為a的函數調用自身,a(){ a() } 。常見的用法比如處理樹形結構數據,商品多級分類、多層級部門機構等
J. 怎麼寫 java 遞歸解決刪除文件夾以及子文件
import java.util.Scanner;
import java.io.*;
public class Del {
/**
* @刪除文件或文件夾 chsNight
*/
public static String adders;
public static void main(String[] args) throws IOException {
Scanner input = new Scanner(System.in);
System.out.print("請輸入要刪除的文件地址:");
adders = input.next();
System.out.print("確定刪除?(Y/N):");
String sfdel = input.next();
while (sfdel.equalsIgnoreCase("y")) {
del(adders);
break;
}
}
private static void del(String adders) {
File file = new File(adders);
if (file.isFile() == true) { // 如果是文件,直接刪除
file.delete();
jg();
} else if (file.isDirectory() == true) { // 如果是文件夾
if (file.listFiles().length == 0) { // 如果是空文件夾
file.delete();
jg();
} else {
int zfiles = file.listFiles().length; // 子文件數量
File[] delfile = file.listFiles(); // 子文件路徑
for (int i = 0; i < zfiles; i++) {
if (delfile[i].isDirectory()) {
del(delfile[i].getAbsolutePath()); // 遞歸調用del方法並取得子目錄路徑
}
System.out.println(delfile[i]);
delfile[i].delete();
}
file.delete();
jg();
}
} else {
System.out.println("刪除失敗:不存在該對象!");
}
}
public static void jg() {
System.out.println("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("\n" + adders + "刪除成功!");
}
}