文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java编程内功-数据结构与算法「递归」

2024-12-03 07:25

关注

递归能解决什么样的问题

  1. 各种数学问题如:八皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子问题(google编程大赛).
  2. 各种算法中也会用到递归,比如快排,归并排序,二分查找,分治算法等.
  3. 将用栈解决的问题->递归代码比较简洁.

递归需要遵守的规则

  1. 执行一个方法时,就创建一个新的受保护的独立空间(栈空间).
  2. 方法的局部变量是独立的,不会相互影响.
  3. 如果方法中使用的变量是引用类型的变量(比如数组),就会共享该引用类型的数据.
  4. 递归必须向退出递归的条件逼近,否则就是无限递归.
  5. 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕.

递归回溯解决迷宫问题

在一个二维数组中,1表示墙,求小球从指定点到终点走过的路径.

  1. package com.structures.recursion; 
  2.  
  3. public class MiGong { 
  4.     public static void main(String[] args) { 
  5.         //先创建二维数组模拟迷宫,地图 
  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.         //设置挡板 
  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.  
  41.      
  42.     public static boolean setWay(int[][] map, int i, int j) { 
  43.         if (map[6][5] == 2) { 
  44.             return true
  45.         } else { 
  46.             if (map[i][j] == 0) {//如果当前这个点没有走过 
  47.                 //按照策略下->右->上->左 走 
  48.                 map[i][j] = 2;//假定该点可以走通 
  49.                 if (setWay(map, i + 1, j)) {//向下走 
  50.                     return true
  51.                 } else if (setWay(map, i, j + 1)) {//向右走 
  52.                     return true
  53.                 } else if (setWay(map, i - 1, j)) {//向上走 
  54.                     return true
  55.                 } else if (setWay(map, i, j - 1)) {//向左走 
  56.                     return true
  57.                 } else { 
  58.                     map[i][j] = 3;//说明该点是死路,走不通 
  59.                     return false
  60.                 } 
  61.             } else { 
  62.                 //如果map[i][j] != 0,说明可能是1,2,3 
  63.                 return false
  64.             } 
  65.         } 
  66.     } 

八皇后问题

在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即:任意两个皇后都不能处于同一行,同一列,同一斜线上,问有多少种摆法.

理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题,arr[8]={0,4,7,5,2,6,1,3},对应arr下标表示第几行,即第几个皇后,arr[i]=val,val表示第i+1个皇后,放在第i+i行的val+1列.

  1. package com.structures.recursion; 
  2.  
  3. public class Queen8 { 
  4.     //表示共有多少个皇后 
  5.     private int max = 8; 
  6.     //定义数组array,保存皇后放置位置的结果,比如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个皇后 
  18.     public void check(int n) { 
  19.         if (n == max) {//n=8 说明前面已经放好 
  20.             print(); 
  21.             count++; 
  22.             return
  23.         } 
  24.         //依次放入皇后并判断是否冲突 
  25.         for (int i = 0; i < max; i++) { 
  26.             //先把当前的皇后n,放到改行的第1列 
  27.             array[n] = i; 
  28.             //判断当放置第n个皇后到第i列是,是否冲突. 
  29.             if (judge(n)) { 
  30.                 //接着放n+1皇后,开始递归 
  31.                 check(n + 1); 
  32.             } 
  33.         } 
  34.     } 
  35.  
  36.     //查看当放置第n个皇后时,就去检测该皇后是否前面已经摆放的皇后冲突 
  37.     private boolean judge(int n) { 
  38.         for (int i = 0; i < n; i++) { 
  39.             //array[i] == array[n] 表示第n个皇后是否与之前的皇后在同一列 
  40.             //Math.abs(n - i) == Math.abs(array[n] - array[i]) 表示第n个皇后是否与之前在同一个斜线 
  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.     } 

 【编辑推荐】

  1. 在Ubuntu Linux上安装Windows 10的最简单方法
  2. 9个Linux 常用查看系统硬件信息命令(实例详解)
  3. 一文告诉你为什么有那么多人在炒币?
  4. 推荐 10 个标星 100 K 的 GitHub 开源项目
  5. 甚至连Excel都落于下风!WPS这些功能你都知道吗

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯