package com.example.demo;
import java.util.ArrayList;
import java.util.List;
/**
*
* <P>Description: 约瑟夫问题</P>
* @ClassName: YueSefu
* @author 冯浩 2018年4月24日 上午10:38:49
* @see TODO
*/
public class YueSefu {
public static void yuesefu(int totalNum, int countNum) {
// 初始化人数
List<Integer> start = new ArrayList<Integer>();
for (int i = 1; i <= totalNum; i++) {
start.add(i);
}
//从第K个开始计数
int k = 0;
while (start.size() >0) {
k = k + countNum;
//第m人的索引位置
k = k % (start.size()) - 1;
System.out.println(String.format("k %s size %s", k,start.size()));
// 判断是否到队尾
if (k < 0) {
System.out.println(start.get(start.size()-1));
start.remove(start.size() - 1);
k = 0;
} else {
System.out.println(start.get(k));
start.remove(k);
}
}
}
public static void main(String[] args) {
YueSefu.yuesefu(41, 3);
// int a=3%1;
// System.out.println(a);
}
}
package com.example.demo;
import org.junit.Test;
/**
*
* <P>Description: 递归相关代码</P>
* @ClassName: DiGui
* @author 冯浩 2018年4月27日 下午2:10:05
*
*
* 分治算法--归并排序
*/
public class DiGui {
public long[] array;
/**
*
* <p>Title: threeJiaoHanShu</p>
* <p>Description: 三角函数</p>
* @author 冯浩 2018年4月27日 下午2:11:52
*
* 三角函数描述
* 1 3 6 10 15 21 28
* 1 2 3 4 5 6 7
*
* 查询第n项的值,查看数据规律可知n的值=n+n-1+n-2...1
*/
@org.junit.Test
public void threeJiaoHanShu() {
int three = three(3);
System.out.println(three);
}
public int three(int n) {
System.out.println(n);
//明确递归的基准情况
if(n == 1) {
return 1;
}else {
return n+three(n-1);
}
}
/**
* i! 阶乘
* 2! 1*2
* 3! 1*2*3
* 4! 1*2*3*4
* <p>Title: jiecheng</p>
* <p>Description: 阶乘</p>
* @author 冯浩 2018年4月27日 下午2:37:26
*/
@org.junit.Test
public void jiecheng() {
int jie = jie(4);
System.out.println(jie);
}
public int jie(int i) {
if(i==1) {
return 1;
}else {
return i * jie(i-1);
}
}
/**
*
* <p>Title: twoFind</p>
* <p>Description: 二分查找法</p>
* @author 冯浩 2018年4月27日 下午2:55:08
*/
@org.junit.Test
public void twoFind() {
this.array= new long[] {1,2,4,6,8,9};
long find = find(4, array.length, 0);
System.out.println(find);
}
public long find(long key,int hight,int low) {
int curIn=(low+hight)/2;
if(array[curIn]==key) {
return curIn;
}else if(low>hight) {
return array.length;
}else {
if(key<array[curIn]) {
return find(key,curIn-1,low);
}else {
return find(key,hight,curIn+1);
}
}
}
/**
*
* <p>Title: hannuota</p>
* <p>Description: 汉诺塔</p>
* @author 冯浩 2018年4月27日 下午3:52:21
*
*移动盘子
* A B C
* 3
* 先将A中的n-1移动到B
* 再将A中的第n个移动到C
* 再将B中的移动到C
*/
@Test
public void hannuota() {
moveTower(3, "A", "B", "C");
}
public void moveTower(int n,String from,String inner,String to) {
if(n == 1) {
System.out.println("Disk 1 from "+from+" to "+ to);
}else {
moveTower(n-1, from, to, inner);
System.out.println("Disk "+n+" from "+from+" to "+ to);
moveTower(n-1, inner, from, to);
}
}
}