java許可權遞歸(遞歸賦許可權)

本文目錄一覽:

關於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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HBIY的頭像HBIY
上一篇 2024-10-04 00:22
下一篇 2024-10-04 00:22

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論