递归实例,欢迎大家修改优化

问题一

昨天同事提了一个问题:有50个学生站成圆圈(学号为1~50),从1开始报数,报数为4的倍数的学生离开圆圈,剩下的继续报数直至全部离开,问最后一个离开圆圈的是哪个同学?

说这个能使用递归实现了话请大家吃饭,赶紧上代码,今天大家等着吃饭呢!

 1    /**
 2      * 获取最后一个离开圆圈的学生
 3      * @param list 学生学号集合
 4      * @param hao 即将报的数
 5      * @return
 6      */
 7     public static List<Integer> getNum(List<Integer> list,int hao){
 8         //不等于一个继续报数
 9         if (list.size() != 1) {
10             //报数为4的倍数的下标集合
11             List<Integer> listIndex = new ArrayList<Integer>();
12             for (int i = 0; i < list.size(); i++) {
13                 if ((i+hao) % 4 == 0) {
14                     listIndex.add(i);
15                 }
16             }
17             //报数
18             hao = hao + list.size();
19             //删除报数为4的倍数的学生
20             for (int i = listIndex.size()-1; i >= 0; i--) {
21                 System.out.println("remove  "+list.get(listIndex.get(i)));
22                 int index = listIndex.get(i);
23                 list.remove(index);
24             }
25             //继续报数递归
26             list = getNum(list, hao);
27         }
28         return list;
29     }

main方法

1     List<Integer> list = new ArrayList<Integer>();
2     for (int j = 1; j < 51; j++) {
3         list.add(j);
4     }
5     list = getNum(list, 1);
6     System.out.println("num  "+list.get(0));

执行过程

/**
 *第1圈:[1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, 42, 43, 45, 46, 47, 49, 50]  即将报数号: 51
 *第2圈: [1, 3, 5, 6, 9, 10, 11, 14, 15, 17, 19, 21, 22, 25, 26, 27, 30, 31, 33, 35, 37, 38, 41, 42, 43, 46, 47, 49]  即将报数号:89
 *第3圈: [1, 3, 5, 9, 10, 11, 15, 17, 19, 22, 25, 26, 30, 31, 33, 37, 38, 41, 43, 46, 47]  即将报数号:117
 *第4圈: [1, 3, 5, 10, 11, 15, 19, 22, 25, 30, 31, 33, 38, 41, 43, 47]  即将报数号:138
 *第5圈: [1, 3, 10, 11, 15, 22, 25, 30, 33, 38, 41, 47]  即将报数号:154
 *第6圈: [1, 3, 11, 15, 22, 30, 33, 38, 47]  即将报数号:166
 *第7圈: [1, 3, 15, 22, 30, 38, 47]  即将报数号:175
 *第8圈: [1, 15, 22, 30, 47] 即将报数号:182
 *第9圈: [1, 15, 30, 47] 即将报数号:187
 *第10圈: [1, 30, 47] 即将报数号:191
 *第11圈: [1, 47] 即将报数号:194
 *第12圈: [1, 47] 即将报数号:196
 *第13圈: [47] 即将报数号:198
 */

问题二

       研究北京赛车PK10前几投注注数(不重复组合),开奖号码为:1~10不能重复,

如前二(冠亚必选),冠军选球:4 5 6 亚军选球:5 6 7 8 。投注注数(不重复组合)为10注。

如前三(前三必选),根据如下选球注数为72注。

如前四(前四必选),根据如下选球注数为110注。

代码如下

递归算法:

 1     /**
 2      * 递归处理前几
 3      * @param counts 注数
 4      * @param ball 球号
 5      * @param tb_ball 选球组合
 6      * @return
 7      */
 8     public static int getCount(int counts,String ball,List<List<Integer>> tb_ball){
 9         List<Integer> t = null;
10         List<List<Integer>> tb_ball1 = new ArrayList<List<Integer>>();
11         if(tb_ball.size()>0){
12             t = tb_ball.get(0);
13             tb_ball1.addAll(tb_ball);
14             tb_ball1.remove(0);
15         }
16         if (t!=null){
17             for(int k=0; k<t.size();k++){
18                 if(ball.indexOf(","+t.get(k)+",") >= 0){
19                     continue;
20                 }
21                 if (tb_ball1.size() == 0) {
22                     counts++;
23                 } else {
24                     ball = ball + t.get(k)+",";
25                     counts = getCount(counts,ball, tb_ball1);
26                     ball = ball.replace(t.get(k)+",", "");
27                 }
28             }
29         }
30         return counts;
31     }

main方法

 1             int counts = 0;
 2             //如上前二测试
 3             List<List<Integer>> listAll = new ArrayList<List<Integer>>();
 4             List<Integer> listOne = new ArrayList<Integer>();
 5             listOne.add(4);
 6             listOne.add(5);
 7             listOne.add(6);
 8             List<Integer> listTwo = new ArrayList<Integer>();
 9             listTwo.add(5);
10             listTwo.add(6);
11             listTwo.add(7);
12             listTwo.add(8);
13             listAll.add(listOne);
14             listAll.add(listTwo);
15             counts = getCount(counts, ",", listAll);
16             System.out.println("前二注数为:" + counts);

结果:  前二注数为:10

有兴趣的伙伴可以自己测试。

原文地址:https://www.cnblogs.com/180308-new-file/p/8527023.html

时间: 2024-10-30 10:45:19

递归实例,欢迎大家修改优化的相关文章

WebPack实例与前端性能优化

[前端构建]WebPack实例与前端性能优化 计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 构建工具层出不穷.多多益处(提

软键盘实例 request参数修改

软键盘实例 request参数修改 这里的键盘 里面的内容是乱序的,每次请求都会不一样的顺序. 键盘内容是一个DIV的背景图,方框是DIV边框.控制按钮直接在前台控制就行. 请求流程如下 JSP请求软键盘图片->action 绘制图片并记录 每个值对应的位置 JSP登录(密码位置)-->Filter把密码转换成真实密码值->登录校验Filter 代码如下 <%@ page isELIgnored="false" %> <%@ page languag

Oracle12c中配置实例参数和修改容器数据库(CDB)及可插拔数据库(PDB)

Oracle12c中的多宿主选项允许一个容器数据库(CDB)容纳多个独立的可插拔数据库(PDB).本文将展示如何配置实例参数和修改容器数据库(CDB)及可插拔数据库(PDB).1. 配置CDB中的实例参数(ALTER SYSTEM)配置CDB实例参数和配置非CDB实例参数没什么不一样.ALTER SYSTEM命令用来设置初始化参数,而有些数据库配置修改需要用ALTER DATABASE命令.作为一个特权用户登录且连接到根容器时,任何ALTER SYSTEM命令默认都将作用于该根容器.这意味着如下

【前端构建】WebPack实例与前端性能优化

计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 构建工具层出不穷.多多益处(提升团队协作,以及工程运维,避免人工处理琐碎而重

非递归线段树区间修改区间求和的两种实现(以POJ 3468为例)

题意:就是一个数列,支持  查询区间和  以及  区间内的数都加上 C . 递归线段树很好写,就不讲了. 递归版本        : 内存:6500K   时间:2.6 秒 非递归版本一: 内存:4272K   时间:1.1秒 非递归版本二: 内存:4272K   时间:1.3秒 -------------------------------------------------------------------------------------------------------------

Java之递归遍历目录,修改指定文件的指定内容

EditProperties.java 1 package PropertiesOperation.Edit; 2 3 import java.io.File; 4 5 /** 6 * 替换指定Porpoerties文件中的指定内容 7 * 三个参数: 8 * filePath:存放properties文件的目录 9 * srcStr:需要替换的字符串 10 * desStr:用于替换的字符串 11 * */ 12 public class EditProperties { 13 private

递归实例分析

1.公园里面有200个桃子,每天吃掉一半,扔掉一个烂的,第六天剩余多少个桃子? var sl=200;i=0; for(i=0;i<6;i++){ sl=parseInt(sl/2-1); } alert(sl); 2.公园里有一堆桃子,猴子每天吃掉一半,扔掉一个烂的,第六天剩余1个桃子,问刚开始有多少个桃子 var sl=1;i=0; for(i=0;i<6;i++){ sl=(sl+1)*2; } alert(sl); 递归:特点:自己调用自己 function shuLiang(ts){

tcl/tk实例详解——修改目录下所有文件(使用一个字符串代替另外一个)

#假设目录下全部都是普通文件,如果目录下还有子目录请#参考文章"读取文件夹下所有文件返回路径",#http://blog.csdn.net/dulixin/archive/2008/02/29/2133840.aspx##此脚本的方法主要应用于处理大批量中小文件##主要使用命令:open.string map.read###mydir:需要修改的文件所在目录#str1:被替换的字符串#str2:替换的字符串 set mydir "C:/test"set str1 &

关于表格动态添加行并处理相关表单元素的一些修改----优化for重用(2)

功能介绍: 1.处理了动态行与表单的设值问题 2.添加了行的向上或向下排序 3.添加了可以在当前行的下边或上边增加新行的功能 4.添加了可以单选或勾选多项删除不需要的行的功能 5.添加了新增的行的高亮(以new红标记标注)的功能 6.实现了可以不依靠样式表(即:即使不要<style></style>部分,功能不会一点) 7.实现了方便后端的接收的数据形式(通过一个动态的长度设置,后端获取这个动态长度并且从1开始循环即可接收相关数据) 8.实现了方便后端进行编辑时的界面(即添加与编辑