成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java編程內(nèi)功-數(shù)據(jù)結(jié)構(gòu)與算法「遞歸」

開發(fā) 后端 算法
遞歸就是方法自己調(diào)用自己,每次調(diào)用時(shí)傳入不同的變量.遞歸有助于編程者解決復(fù)雜的問題,同時(shí)可以讓代碼變得整潔.

[[392763]]

概念

簡(jiǎn)單地說:遞歸就是方法自己調(diào)用自己,每次調(diào)用時(shí)傳入不同的變量.遞歸有助于編程者解決復(fù)雜的問題,同時(shí)可以讓代碼變得整潔.

遞歸能解決什么樣的問題

  1. 各種數(shù)學(xué)問題如:八皇后問題,漢諾塔,階乘問題,迷宮問題,球和籃子問題(google編程大賽).
  2. 各種算法中也會(huì)用到遞歸,比如快排,歸并排序,二分查找,分治算法等.
  3. 將用棧解決的問題->遞歸代碼比較簡(jiǎn)潔.

遞歸需要遵守的規(guī)則

  1. 執(zhí)行一個(gè)方法時(shí),就創(chuàng)建一個(gè)新的受保護(hù)的獨(dú)立空間(棧空間).
  2. 方法的局部變量是獨(dú)立的,不會(huì)相互影響.
  3. 如果方法中使用的變量是引用類型的變量(比如數(shù)組),就會(huì)共享該引用類型的數(shù)據(jù).
  4. 遞歸必須向退出遞歸的條件逼近,否則就是無限遞歸.
  5. 當(dāng)一個(gè)方法執(zhí)行完畢,或者遇到return,就會(huì)返回,遵守誰調(diào)用就將結(jié)果返回給誰,同時(shí)當(dāng)方法執(zhí)行完畢或者返回時(shí),該方法也就執(zhí)行完畢.

遞歸回溯解決迷宮問題

在一個(gè)二維數(shù)組中,1表示墻,求小球從指定點(diǎn)到終點(diǎn)走過的路徑.

  1. package com.structures.recursion; 
  2.  
  3. public class MiGong { 
  4.     public static void main(String[] args) { 
  5.         //先創(chuàng)建二維數(shù)組模擬迷宮,地圖 
  6.         int[][] map = new int[8][7]; 
  7.         //使用1表示墻,迷宮的上下左右邊全部置為1 
  8.         for (int i = 0; i < 7; i++) { 
  9.             map[0][i] = 1; 
  10.             map[7][i] = 1; 
  11.         } 
  12.         for (int i = 0; i < 8; i++) { 
  13.             map[i][0] = 1; 
  14.             map[i][6] = 1; 
  15.         } 
  16.         //設(shè)置擋板 
  17.         map[3][1] = 1; 
  18.         map[3][2] = 1; 
  19.         //輸出地圖 
  20.         System.out.println("原始地圖"); 
  21.         for (int i = 0; i < 8; i++) { 
  22.             for (int j = 0; j < 7; j++) { 
  23.                 System.out.print(map[i][j] + " "); 
  24.             } 
  25.             System.out.println(); 
  26.         } 
  27.  
  28.         //使用遞歸回溯找路 
  29.         setWay(map, 1, 1); 
  30.         System.out.println("按策略走過的路"); 
  31.         for (int i = 0; i < 8; i++) { 
  32.             for (int j = 0; j < 7; j++) { 
  33.                 System.out.print(map[i][j] + " "); 
  34.             } 
  35.             System.out.println(); 
  36.         } 
  37.  
  38.         /* 
  39.         原始地圖 
  40.         1 1 1 1 1 1 1 
  41.         1 0 0 0 0 0 1 
  42.         1 0 0 0 0 0 1 
  43.         1 1 1 0 0 0 1 
  44.         1 0 0 0 0 0 1 
  45.         1 0 0 0 0 0 1 
  46.         1 0 0 0 0 0 1 
  47.         1 1 1 1 1 1 1 
  48.         按策略走過的路 
  49.         1 1 1 1 1 1 1 
  50.         1 2 0 0 0 0 1 
  51.         1 2 2 2 0 0 1 
  52.         1 1 1 2 0 0 1 
  53.         1 0 0 2 0 0 1 
  54.         1 0 0 2 0 0 1 
  55.         1 0 0 2 2 2 1 
  56.         1 1 1 1 1 1 1 
  57.          */ 
  58.     } 
  59.  
  60.     /** 
  61.      * 使用遞歸回溯來找路,如果能map[6][5]位置,則說明通路找到 
  62.      * 約定:當(dāng)map[i][j]為0表示該點(diǎn)沒有走過,當(dāng)為1表示墻,當(dāng)為2表示通路可以走,3表示該點(diǎn)已經(jīng)走過,但是走不通 
  63.      * 在走迷宮時(shí),需要確定一個(gè)策略(方法),下->右->上->左,如果走不通再回溯 
  64.      * 
  65.      * @param map 表示地圖 
  66.      * @param i   從哪個(gè)位置開始行坐標(biāo) 
  67.      * @param j   從哪個(gè)位置開始列坐標(biāo) 
  68.      * @return 如果找到通路, 就返回true, 否則返回false 
  69.      */ 
  70.     public static boolean setWay(int[][] map, int i, int j) { 
  71.         if (map[6][5] == 2) { 
  72.             return true
  73.         } else { 
  74.             if (map[i][j] == 0) {//如果當(dāng)前這個(gè)點(diǎn)沒有走過 
  75.                 //按照策略下->右->上->左 走 
  76.                 map[i][j] = 2;//假定該點(diǎn)可以走通 
  77.                 if (setWay(map, i + 1, j)) {//向下走 
  78.                     return true
  79.                 } else if (setWay(map, i, j + 1)) {//向右走 
  80.                     return true
  81.                 } else if (setWay(map, i - 1, j)) {//向上走 
  82.                     return true
  83.                 } else if (setWay(map, i, j - 1)) {//向左走 
  84.                     return true
  85.                 } else { 
  86.                     map[i][j] = 3;//說明該點(diǎn)是死路,走不通 
  87.                     return false
  88.                 } 
  89.             } else { 
  90.                 //如果map[i][j] != 0,說明可能是1,2,3 
  91.                 return false
  92.             } 
  93.         } 
  94.     } 

八皇后問題

在8*8的國(guó)際象棋上擺放8個(gè)皇后,使其不能相互攻擊,即:任意兩個(gè)皇后都不能處于同一行,同一列,同一斜線上,問有多少種擺法.

理論上應(yīng)該創(chuàng)建一個(gè)二維數(shù)組來表示棋盤,但是實(shí)際上可以通過算法,用一個(gè)一維數(shù)組即可解決問題,arr[8]={0,4,7,5,2,6,1,3},對(duì)應(yīng)arr下標(biāo)表示第幾行,即第幾個(gè)皇后,arr[i]=val,val表示第i+1個(gè)皇后,放在第i+i行的val+1列.

  1. package com.structures.recursion; 
  2.  
  3. public class Queen8 { 
  4.     //表示共有多少個(gè)皇后 
  5.     private int max = 8; 
  6.     //定義數(shù)組array,保存皇后放置位置的結(jié)果,比如arr[8]={0,4,7,5,2,6,1,3} 
  7.     private int[] array = new int[max]; 
  8.  
  9.     static int count = 0; 
  10.  
  11.     public static void main(String[] args) { 
  12.         Queen8 queen8 = new Queen8(); 
  13.         queen8.check(0); 
  14.         System.out.printf("總共%d擺法\n",count);//92種 
  15.     } 
  16.  
  17.     //放置第n個(gè)皇后 
  18.     public void check(int n) { 
  19.         if (n == max) {//n=8 說明前面已經(jīng)放好 
  20.             print(); 
  21.             count++; 
  22.             return
  23.         } 
  24.         //依次放入皇后并判斷是否沖突 
  25.         for (int i = 0; i < max; i++) { 
  26.             //先把當(dāng)前的皇后n,放到改行的第1列 
  27.             array[n] = i; 
  28.             //判斷當(dāng)放置第n個(gè)皇后到第i列是,是否沖突. 
  29.             if (judge(n)) { 
  30.                 //接著放n+1皇后,開始遞歸 
  31.                 check(n + 1); 
  32.             } 
  33.         } 
  34.     } 
  35.  
  36.     //查看當(dāng)放置第n個(gè)皇后時(shí),就去檢測(cè)該皇后是否前面已經(jīng)擺放的皇后沖突 
  37.     private boolean judge(int n) { 
  38.         for (int i = 0; i < n; i++) { 
  39.             //array[i] == array[n] 表示第n個(gè)皇后是否與之前的皇后在同一列 
  40.             //Math.abs(n - i) == Math.abs(array[n] - array[i]) 表示第n個(gè)皇后是否與之前在同一個(gè)斜線 
  41.             if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) { 
  42.                 return false
  43.             } 
  44.         } 
  45.         return true
  46.     } 
  47.  
  48.     //將皇后擺放的位置輸出 
  49.     public void print() { 
  50.         for (int i = 0; i < array.length; i++) { 
  51.             System.out.print(array[i] + " "); 
  52.         } 
  53.         System.out.println(); 
  54.     } 

 【編輯推薦】

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-03-09 06:30:32

JAVA數(shù)據(jù)結(jié)構(gòu)算法

2021-03-18 08:44:20

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-05-12 09:07:09

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-08 06:28:57

JAVA數(shù)據(jù)結(jié)構(gòu)與算法稀疏數(shù)組

2021-03-10 08:42:19

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-17 09:27:36

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-12 09:13:47

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-23 08:33:22

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-26 08:40:28

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-27 06:21:29

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-15 09:36:44

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-14 08:27:40

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-22 10:07:45

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-07 09:26:37

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-16 09:40:52

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-05-13 07:34:56

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-24 10:41:04

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-23 09:12:09

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-11 08:53:20

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-05-08 08:28:38

Java數(shù)據(jù)結(jié)構(gòu)算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩一区二区三区视频 | 丝袜 亚洲 欧美 日韩 综合 | 欧美视频一区二区三区 | 一级黄色片网站 | 九九热这里只有精品6 | 亚洲午夜在线 | 成年人在线视频 | 99av成人精品国语自产拍 | 欧美精品久久久久 | 午夜影院污 | 精品视频在线免费观看 | 久久久人 | 中文字幕免费视频 | 99精品欧美一区二区三区综合在线 | 理伦毛片 | 在线一区视频 | 久久久久久免费毛片精品 | 成人精品在线观看 | 不卡欧美 | 欧美视频三区 | 亚洲日本欧美日韩高观看 | 久久伊人青青草 | 国产精品亚洲视频 | 国产高清久久久 | 国产精品久久久久一区二区三区 | 欧美三级久久久 | 欧美 日韩 视频 | 9久9久9久女女女九九九一九 | 草草草网站 | 狠狠色香婷婷久久亚洲精品 | 精品亚洲一区二区三区 | 成人在线免费 | 人人看人人射 | www,黄色,com| 一区二区三区四区不卡 | 福利久久 | 久久精品国产精品青草 | 欧美综合一区 | 成人深夜小视频 | 成人av网页 | 99热这里有精品 |