狐狸找兔子(java 版)

围绕着山顶有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

firstfind(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、源代码

/**

 *  狐狸找兔子

 * @author chen

 */

public class Josephus {

    public static void main(String[] args) {

        int num = 1000;

        int holeNum = 11;

        // 数组 实现

        findRabbit(num, holeNum);

        // 递归实现

        find(num);

    }

    /**

     * 数组实现

     * @param num

     * @param holeNum

     */

    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);

            }

        }

    }


    /**

     *  减一法实现

     * @param num

     * @return

     */

    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;

        }

    }

}

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrchesian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值