围绕着山顶有10个洞,一只狐狸和一只兔子住在各自的洞里。狐狸想吃掉兔子。
一天,兔子对狐狸说:“你想吃我有一个条件,先把洞从1-10编上号,你从10号洞出发,
先到1号洞找我;第二次隔1个洞找我,第三次隔2个洞找我,以后依次类推,次数不限,若能找到我,
你就可以饱餐一顿。不过在没有找到我以前不能停下来。” 狐狸满口答应,就开始找了。它从早到晚进了1000次洞,
累得昏了过去,也没找到兔子,请问,兔子躲在几号洞里?
1、伪代码
// 数组实现
算法 FindRabbit(num, holeNum)
// 输入 num 为 fox 找的次数, holeNum为洞的个数
// 输出 没被访问hole
for i ← 1 to holeNumdo
hole[i]= 1
for i ← 1 and j = 0 to num do
j← j + i
ifj > 10
j← j %10
printj
hole[j] = 1 // 把访问过的洞置为一
for i ← 1 to holeNumdo
ifhole[i] = 0
printi
// 递归实现
算法 FindRabbit(num)
// 输出 fox 已经找过的洞
// 输入 fox 找的次数
if num = 1return 1 // fox 第一次找的是第一个洞
else
first ← find(num - 1) + num;
if first > 10
print first%10
return first;
2、效率分析
// 数组实现效率分析
该算法有三个for 循环,基本操作为赋值
C(n, m)=2 + = 2m + n O(m + n)
// 递归实现效率分析
通过分析 可以发现 递归式F(n) =F(n-1) + n 基本操作为赋值
而次数函数 为 C(n) = C(n-1) +1 C(1) = 1
可知 C(n) = n O(n)
3、源代码
public class Josephus {
public static void main(String[] args) {
int num = 1000;
int holeNum = 11;
// 数组 实现
findRabbit(num, holeNum);
// 递归实现
find(num);
}
public static void findRabbit(int num, int holeNum) {
int hole[] = new int[holeNum];
// 表示没被访问过
for (int i = 1; i < holeNum; i++) {
hole[i] = 0;
}
for (int i = 1, j = 0; i <= num; i++) {
j = j + i;
if (j > 10) {
j = j % 10;
}
System.out.println("第 " + i + " 次 , 找到 洞 " + j);
hole[j] = 1;
}
// 表示没被访问过
for (int i = 1; i < holeNum; i++) {
if (hole[i] == 0) {
System.out.println(i);
}
}
}
public static int find(int num){
if(num == 1){
System.out.println("第 1 次 , 找到 洞 1");
return 1;
}else {
int first = find(num - 1) + num;
int hole = first;
if (hole > 10) {
hole = hole % 10;
}
System.out.println("第 " + num + " 次 , 找到 洞 " + hole);
return first;
}
}
}