【数据结构与算法 8】递归之迷宫问题

旧城等待, 2021-08-29 12:09 474阅读 0赞

一、简介

递归就是方法自己调用自己,每次调用时传入不同的参数,递归有利于编程者解决复杂的问题,同时可以让代码变得简洁。

二、用一个例子引出递归概念

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

打眼一看,很low,很简单,4,3,2无疑。

为了验证我的聪明才智,输出一把吧

20200520103324125.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh_size_16_color_FFFFFF_t_70

三、递归调用规则(很重要)

1、执行一个方法时,就创建一个新的受保护的独立空间(栈空间);

2、方法的局部变量是独立的,不会相互影响,比如变量n;

3、如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据;

4、递归必须向退出递归的条件逼近,否则就是无限递归,StackOverflowError;

5、当一个方法执行完毕,或遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或return时,该方法也就执行完毕。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh_size_16_color_FFFFFF_t_70 1

四、递归能解决什么样的问题

1、各种数学问题

比如八皇后问题、哈诺塔、阶乘问题、迷宫问题、球和篮子的问题(Google编程大赛)。

2、各种算法中也会使用递归

比如快排、归并排序、二分查找、分治算法。

3、栈解决的问题都可以用递归

代码更加简洁。

五、迷宫问题

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh_size_16_color_FFFFFF_t_70 2

1、代码实现

  1. package dataStructure.recursion;
  2. public class Labyrinth {
  3. public static void main(String[] args) {
  4. //迷宫问题
  5. //0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通
  6. int[][] map = new int[8][7];
  7. for(int i=0;i<8;i++){
  8. for (int j = 0; j < 7; j++) {
  9. map[0][j] = 1;
  10. map[7][j] = 1;
  11. map[i][0] = 1;
  12. map[i][6] = 1;
  13. }
  14. }
  15. //设置挡板, 1 表示
  16. map[3][1] = 1;
  17. map[3][2] = 1;
  18. for (int i = 0; i < 8; i++) {
  19. for (int j = 0; j < 7; j++) {
  20. System.out.print(map[i][j]+" ");
  21. }
  22. System.out.println();
  23. }
  24. setWay(map,1,1);
  25. System.out.println("迷宫走过之后地图");
  26. for (int i = 0; i < 8; i++) {
  27. for (int j = 0; j < 7; j++) {
  28. System.out.print(map[i][j]+" ");
  29. }
  30. System.out.println();
  31. }
  32. }
  33. //使用递归回溯来给小球找路
  34. //说明
  35. //1. map 表示地图
  36. //2. i,j 表示从地图的哪个位置开始出发 (1,1)
  37. //3. 如果小球能到 map[6][5] 位置,则说明通路找到.
  38. //4. 约定: 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通
  39. //5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯
  40. private static boolean setWay(int[][] map,int i,int j){
  41. if(map[6][5] == 2){
  42. return true;
  43. }else{
  44. if(map[i][j]==0){
  45. map[i][j] = 2;
  46. if(setWay(map,i+1,j)){//下
  47. return true;
  48. }else if(setWay(map,i,j+1)){//右
  49. return true;
  50. }else if(setWay(map,i-1,j)){//上
  51. return true;
  52. }else if(setWay(map,i,j-1)){//左
  53. return true;
  54. }else{
  55. map[i][j] = 3;
  56. return false;
  57. }
  58. }else {
  59. return false;
  60. }
  61. }
  62. }
  63. }

2、控制台输出

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh_size_16_color_FFFFFF_t_70 3

注:1表示墙,2表示你走的路,0表示没走的路。

这个还是挺简单的!

每一篇博客都是一种经历,程序猿生涯的痕迹,知识改变命运,命运要由自己掌控,愿你游历半生,归来仍是少年。

欲速则不达,欲达则欲速!

发表评论

表情:
评论列表 (有 0 条评论,474人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法数据结构

    一、什么是递归 递归是一种解决问题的方法,将问题分解为更小的子问题,直到得到一个足够小的问题可以 被很简单的解决。通常递归涉及函数调用自身。递归允许我们编写优雅的解决方案,