常見的遞歸Java實現

形如

public static void test(int n) {if (n > 2) {test(n - 1);}System.out.println("n=" + n);
}

重要規則

  • 執行一個方法時,就創建一個新的受保護的獨立空間(棧空間)
  • 方法的局部變量是獨立的,不會相互影響
  • 如果方法中使用的是引用類型變量,就會共享該引用類型的數據
  • 遞歸必須向退出遞歸的條件逼近,否則就是無限遞歸,出現棧溢出,死龜了:)
  • 當一個方法執行完畢,或者遇到return,就會返回,遵守誰調用,就將結果返回給誰,同時當方法執行完畢或者返回時,該方法也就執行完華。

主要解決問題

  • 各種數學問題如:8皇后問題,漢諾塔,階乘問題,迷宮問題,球和籃子的問題(googl編程大賽)
  • 各種算法中也會使用到遞歸,比如快排,歸并排序,二分查找,分治算法等
  • 將用棧解決的問題->第歸代碼比較簡潔

迷宮回溯問題

/*** 如果小球能到map[6][5]位置,則說明通路找到* 約定:在map[i][j] 為 0 表示該點沒有走過 當為 1 表示墻; 2 表示通路可以走; 3表示該點已經走過,但是走不通* 在走迷宮時,需要確定一個策略(方法) 下->右->上->左,如果該點走不通,再回溯** @param map 表示地圖* @param i   表示從地圖的哪個位置開始出發(1,1)* @param j* @return*/
public static boolean setWay(int[][] map, int i, int j) {if (map[6][5] == 2) {// 通路已經找到return true;} else {if (map[i][j] == 0) {// 該點還沒有走過map[i][j] = 2; // 假定該點可以走通if (setWay(map, i + 1, j)) {// 向下走return true;} else if (setWay(map, i, j + 1)) {// 向右走return true;} else if (setWay(map, i - 1, j)) {// 向上走return true;}  else if (setWay(map, i, j - 1)) {// 向左走return true;} else {// 說明該點是走不通,是死路map[i][j] = 3;return false;}} else { // 如果map[i][j] != 0,可能是1,2,3return false;}}
}

八皇后遞歸問題

八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾手
1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即:任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法(92)。

算法思路
  1. 第一個皇后先放第一行第一列
  2. 第二個皇后放在第二行第一列、然后判斷是否0K,如果不0K,繼續放在第二列、第三列、依次把所有列都放完,找到一個合適
  3. 繼續第三個皇后,還是第一列、第二列.…直到第8個皇后也能放在一個不沖突的位置,算是找到了一個正確解
  4. 當得到一個正確解時,在棧回退到上一個棧時,就會開始回溯,即將第一個皇后,放到第一列的所有正確解,全部得到.
  5. 然后回頭繼續第一個皇后放第二列,后面繼續循環執行1,2,3,4 的步驟

說明:理論上應該創建一個二維數組來表示棋盤,但是實際上可以通過算法用一個一維數組即可解決問題 arr[8] = {0,4,7,5,2,6,1,3} 表示 對應arr 下標 表示第幾行,即第幾個皇后,arr[i] = val,val表示第 i+1 個皇后,放在第 i+1 行的第 val+1 列

代碼
package com.xiaolu.recursion;/*** @author 林小鹿* @version 1.0* 八皇后遞歸*/
public class Queue8 {// 定義一個max表示共有多少個皇后int max = 8;// 定義數組arry,保存皇后放置位置的結果,如 arr[] = {0,4,7,5,2,6,1,3}int[] array = new int[max];static int count = 0;static int judgeCount = 0;public static void main(String[] args) {Queue8 queue8 = new Queue8();queue8.check(0);System.out.printf("一共有%d種解法", count);System.out.printf("\n一共判斷%d次", judgeCount);}// 放置第 n 個皇后private void check(int n) {if (n == max) { // n = 8 時,第八個皇后就已經放好了print();return;}// 依次放入皇后,并判斷是否沖突// 注意:check 是每一次遞歸時,進入check中都有一個for循環,并且重復執行回溯的過程for (int i = 0; i < max; i++) {// 先把當前這個皇后 n 放到該行的第 1 列array[n] = i;// 判斷是否沖突if (judge(n)) {// 不沖突// 接著放 n+1 個皇后,開始遞歸check(n + 1);}// 如果沖突,就繼續執行 array[n] = i;即 將第 n 個皇后放置在本行的后一個位置}}/*** 判斷檢測皇后是否和前面已經擺放的皇后沖突** @param n 表示第 n 個皇后* @return*/private boolean judge(int n) {judgeCount++;for (int i = 0; i < n; i++) {// array[i] == array[n] 判斷是否通一列// Math.abs(n-i) == Math.abs(array[n] - array[i]) 判斷是否同一斜線// 沒有必要判斷是否在同一行,因為 n 每次都在遞增if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {return false;}}return true;}// 輸入皇后擺放的位置private void print() {count++;for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712518.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【教程】移動互聯網時代的APP上架流程和要點

目錄 摘要 引言 正文 一、應用商店注冊 二、準備APP材料 三、打包上傳App 摘要 本文將介紹移動應用程序上架的基本流程和要點&#xff0c;包括應用商店注冊、APP材料準備、打包上傳App、APP審核以及發布APP的詳細步驟。此外&#xff0c;還會提到利用appuploder工具簡化i…

Gradio學習(五)—————學習一下布局Column的使用

今天學一下布局 非常簡單row就是行column就是列 如下就是兩行兩列 scale就是縮放比例&#xff0c;如下按鈕類scale4&#xff0c;而文本框類scale1&#xff0c;按鈕類顯示寬度就是文本框類寬度的四倍 import gradio as gr with gr.Blocks() as demo:with gr.Row():with gr.Colu…

Spring Cloud 實戰系列之 Zuul 微服務網關搭建及配置

一、創建SpringBoot項目 用mavan搭建也可以。&#xff08;重要的是后面pom里應該引入那些依賴&#xff0c;application.yml怎么配置&#xff09; 由于開始構建項目時選擇了Eureka Server&#xff0c;所以pom.xml中不需要手動添加依賴了 首先在啟動類SpringcloudApplicatio…

SpringBoot項目連接Redis報錯:Connection refused: no further information

今天在使用SpringBoot連接Redis時發生了報錯 明明Jedis能夠連接成功為什么StringRedisTemplate就不行? 然后在網上找了一下說是關閉防火墻或者修改配置文件但是都不管用 最后發現是Redis在SpringBoot3之后yml的配置方式發生了改變 相較于之前多了一個前綴, 由于我剛開始沒有…

項目風險管理的前提是對風險的認知

大家好&#xff0c;我是不會魔法的兔子&#xff0c; 一枚北京執業律師&#xff0c;創建[項目管理者的法小院兒]&#xff0c;持續從法律的角度分享項目管理中的風險問題及預防&#xff0c;讓項目管理者能夠提早發現與解決項目執行過程中的風險&#xff0c;同時歡迎大家一起交流…

論文解讀--Mutual Interference Mitigation in PMCW Automotive Radar

PMCW汽車雷達的相互干擾抑制 摘要 針對相位調制連續波(PMCW)毫米波(mmWave)汽車雷達系統中存在的相互干擾問題進行了研究。對先進駕駛輔助系統(ADAS)的需求日益增長&#xff0c;導致配備在同一頻段工作的毫米波雷達系統的車輛激增&#xff0c;導致相互干擾&#xff0c;可能會降…

WPF 滑動條樣式

效果圖&#xff1a; 淺色&#xff1a; 深色&#xff1a; 滑動條部分代碼&#xff1a; <Style x:Key"RepeatButtonTransparent" TargetType"{x:Type RepeatButton}"><Setter Property"OverridesDefaultStyle" Value"true"/&g…

【Oracle】Oracle清理日志空間

&#xff08;一&#xff09;通過adrci清理日志空間 1.通過find命令查詢大數據文件 find / -type f -size 100M 2.登錄oracle數據庫服務器用戶 su - oracle 3.執行故障診斷命令 adrci 4.查詢ADR目錄 show home 5.切換到對應目錄 set homepath diag/rdbms/orcl 6.執行日志清理命令…

枚舉類、泛型、API

枚舉類 枚舉類可以實現單例設計模式。 枚舉的常見應用場景&#xff1a;用來表示一組信息&#xff0c;然后作為參數進行傳輸。 泛型 API

Qt 中Qwidget相關屬性

文章目錄 1. QWidget 核心屬性1.1 enabled1.2 geometry1.2.1 window frame 的影響 1.3 windowTitle1.4 windowIcon1.4.1 qrc的使用 1.5 windowOpacity1.6 cursor1.7 focusPolicy1.8 styleSheet 1. QWidget 核心屬性 在 Qt 中, 使? QWidget 類表? “控件”. 像按鈕, 視圖, 輸…

今年Android面試必問的這些技術面,2024Android常見面試題

都說程序員是在吃青春飯&#xff0c;這一點的確有一點對的成分&#xff0c;以前我不這么認為&#xff0c;但隨著年齡的增長&#xff0c;事實告訴我的確是這樣的&#xff0c;過了30以后&#xff0c;就會發現身體各方面指標下降&#xff0c;體力和身心上都多少有點跟不上了&#…

Node.js中的緩存策略和緩存技巧

在Node.js中&#xff0c;緩存策略和緩存技巧是提升應用性能和用戶體驗的關鍵因素。通過有效地利用緩存&#xff0c;我們可以顯著減少系統資源的消耗&#xff0c;加快數據訪問速度&#xff0c;從而提升整體的網站性能。本文將針對Node.js中的緩存策略和緩存技巧展開深入探討&…

Newtonsoft.Json

目錄 引言 1、簡單使用 1.1、官方案例 1.2、JsonConvert 2、特性 2.1、默認模式[JsonObject(MemberSerialization.OptIn/OptOut)] 2.2、序列化為集合JsonArrayAttribute/JsonDictionaryAttribute 2.3、序列化該元素JsonProperty 2.4、忽略元素JsonIgnoreAttribute 2.5、…

iOS CVPixelBufferCreate 創建 CVPixelBufferRef 時屏幕拉伸或像素偏移(花屏)

先說結論&#xff1a; CVPixelBufferCreate 創建的 CVPixelBufferRef 可能由以下的原因導致的&#xff1a; 1.pixelFormatType 格式錯誤&#xff0c;換一下格式嘗試 2.width和height 非 32 的整數倍 3.視頻幀的寬高比非標準比例&#xff08;4:3,16:9,1:1&#xff09; 另外說明&…

今天面試招了個18K的人,從騰訊出來的果然都有兩把刷子···

公司前段時間缺人&#xff0c;也面了不少測試&#xff0c;前面一開始瞄準的就是中級的水準&#xff0c;也沒指望來大牛&#xff0c;提供的薪資在15-20k&#xff0c;面試的人很多&#xff0c;但平均水平很讓人失望。看簡歷很多都是4年工作經驗&#xff0c;但面試中&#xff0c;不…

docker save 命令 docker load 命令 快速復制容器

docker save 命令 docker load 命令 1、docker save 命令2、docker load 命令 1、docker save 命令 docker save 命令用于在系統上把正在使用的某個容器鏡像 導出成容器鏡像文件保存下載&#xff0c;以便在其他系統上導入這個容器鏡像文件 以便快速在其他服務器上啟動相同的容…

讀書筆記:《思考 . 快與慢》- 1 系統1 系統2

《思考 . 快與慢》 [美] 丹尼爾 . 卡尼曼 著 胡曉姣 李愛民 何夢瑩 譯 這本書會改變你的思考方式 利用閑談發現和分析別人犯的錯誤比分析自己的錯誤更容易&#xff0c;也更有意思 在人生最輝煌的時候&#xff0c;我們很難對自己的信念和需求產生懷疑&#xff0c;越是在最…

【Web】Java反序列化之CC2——commons-collections4的新鏈之一

目錄 關于commons-collections4 一個重要的思維模型 觸發Transform的關鍵類&#xff1a;TransformingComparator 反序列化的入口&#xff1a;PriorityQueue Exp 關于commons-collections4 commons-collections4 是 Apache Commons 組件庫中的一個項目&#xff0c;它是對舊…

在Linux上定時執行腳本

在Linux上定時執行腳本通常可以使用 ?cron?任務來實現。?cron?是一個系統服務&#xff0c;用于在預定時間自動執行命令或腳本。下面是如何在Linux上設置定時執行腳本的步驟&#xff1a; 編寫腳本&#xff1a;首先&#xff0c;你需要編寫需要定時執行的腳本文件&#xff0c;…

找不到msvcp140.dll無法運行程序如何處理?分享5種解決方法

在計算機系統運行過程中&#xff0c;如果無法找到必要的動態鏈接庫文件msvcp140.dll&#xff0c;可能會引發一系列的問題與故障。這個特定的dll文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;對于許多基于此編譯環境開發的應用程序至關重要。缺失msvcp…