(数据结构与算法)递归及一些经典递归问题
生活随笔
收集整理的這篇文章主要介紹了
(数据结构与算法)递归及一些经典递归问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 遞歸的概念
- 2. 遞歸的調用機制
- 3. 遞歸需要遵守的重要規則
- 4. 遞歸 - 迷宮問題
- 5. 遞歸-八皇后問題
1. 遞歸的概念
遞歸就是方法自己調用自己,每次調用時傳入不同的變量。
遞歸有助于編程者解決復雜的問題,同時可以讓代碼變得更簡潔
2. 遞歸的調用機制
- 當程序執行到一個方法時,就會開辟一個獨立的空間(棧)
- 每個空間的數據(局部變量),是獨立的
打印問題
public class recursionTest {public static void main(String[] args) {//打印問題test(4);}public static void test(int n){if (n>2){test(n-1);}System.out.println("n="+n);}}
階乘問題
public static int factorial(int n){if(n==1){return 1;}else {return factorial(n-1)*n;}}3. 遞歸需要遵守的重要規則
4. 遞歸 - 迷宮問題
紅色代表墻,可以自己設置,終點和起點也可以自己設置。
代碼實現
package com.zh.data_structures.recursion;public class Maze {public static void main(String[] args) {//創建一個二維數組,模仿迷宮int[][] map = new int[8][7];//1代表墻//上下全部置為1for (int i = 0; i < 7 ; i++) {map[0][i] = 1;map[7][i] = 1;}map[3][1] = 1;map[3][2] = 1;//左右全部置為1for (int i = 0; i <8; i++) {map[i][0] = 1;map[i][6] = 1;}//輸出地圖System.out.println("地圖情況");for (int i = 0; i <8 ; i++) {for (int j = 0; j <7 ; j++) {System.out.print(map[i][j]+" ");}System.out.println();}setWay(map,1,1);System.out.println("迷宮走完地圖情況");for (int i = 0; i <8 ; i++) {for (int j = 0; j <7 ; j++) {System.out.print(map[i][j]+" ");}System.out.println();}}/**** @param map 表示地圖* @param i 表示從哪個位置開始找* @param j* @return 如果找到通路就返回true,如果沒找到就返回false*/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 {//走不通,將值置為3map[i][j] = 3;return false;}} else { //表示map[i][j]的值為1,2,3中的一個,直接返回falsereturn false;}}} }5. 遞歸-八皇后問題
問題
在8X8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即:任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法(92)。
思路分析
放完,找到一個合適.
4)當得到一個正確解時,在棧回退到上一個棧時,就會開始回溯,即將第一個皇后,放到第一 列的所有正確解全部得到.
代碼實現
package com.zh.data_structures.recursion;public class Queen8 {//定義一共有8個皇后int max = 8;//定義一個數組保存皇后放置位置的結果int[] array = new int[max];static int count=0;public static void main(String[] args) {Queen8 queen8 = new Queen8();queen8.check(0);System.out.println("一共有"+count+"種解法");}private void check(int n){if (n == max){print();return;}for (int i = 0; i <max ; i++) {//先把這個皇后放在第n行的第一列array[n] = i;if (judge(n)){//判斷當放置到第n行的第一列時是否沖突//不沖突則下一個皇后遞歸check(n+1);}}}/*** 判斷第n個皇后是否與之前的皇后沖突* @param n 表示第n個皇后*/private boolean judge(int n){for (int i = 0; i < n ; i++) {//array[i] == array[n] 表示皇后處在同一列//Math.abs(array[n]-array[i])==Math.abs(n-i)表示處在同一斜線上,即斜率為1if (array[i] == array[n] || Math.abs(array[n]-array[i])==Math.abs(n-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();} }總結
以上是生活随笔為你收集整理的(数据结构与算法)递归及一些经典递归问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSM整合及CRUD实现
- 下一篇: (数据结构与算法)插入排序和希尔排序