约瑟夫算法(数学分析法)

约瑟夫算法(数学分析法)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

//看了帖子后认为有趣就实现了一把递归的约瑟夫算法

  

package test;

/**
 * 500个小孩围成一圈,从第一个開始报数:1,2,3,1,2,3,1,2,3,……每次报3的小孩退出
	 问最后剩下的那个小孩,在曾经500人里是第几个???
 */
public class Test {

	/**
	 * 约瑟夫标准循环非递归解法 
	 * @param n
	 * @param m
	 * @return
	 */
	public static int f2(int n, int m){
		
		int index = 0;
	    for (int i = 2; i <= n; i++) {
	        index = (index + m) % i;
	    }
		return index +1;
	}
	
	/**
	 * 约瑟夫递归算法
	 * @param n
	 * @param m
	 * @return 返回的结果+1 = 终于结果
	 */
	public static int f(int n,int m){
		
		int t = 0;
		if(n==1){
			return t;
		}else{
			t = ( f(n-1, m) + m)%n;
		}
		return t;
		
	}

	
	public static void main(String[] args) {
		//	
		int n = 500;
		int m = 3;
		
		//约瑟夫标准循环非递归解法 
		System.out.println(f2(n, m));//此方法来自帖子
		
		/*
		(函数)index表示(变量)n个人玩游戏报(常量)m退出最后胜利者的编号.则有递推公式:
		index(1) = 0;
		index(n) = (index(n-1) + m)%n;   (n>1)
		这个公式不是仅仅考虑一种场景得出的结果,而是抽象出普遍的n得出的结论,
		
		*/
		/*
		 *f(1) = 0;//第0个
		 *f(2) = 1;//第1个
		 *f(3) = 1;//第2个
		 * */
		//參考上面的提示写了下约瑟夫的递归算法
		System.out.println(f(n, m)+1);
		
		
	}
	
	
}

今天看到一个LinkedList版本号的,測试了,结果一样,补充上:

public static int removeNM(int n, int m) {   
        LinkedList ll = new LinkedList();   
        for (int i = 0; i < n; i++)   
            ll.add(new Integer(i + 1));   
        int removed = -1;   
        while (ll.size() > 1) {   
            removed = (removed + m) % ll.size();   
            System.out.println("出列:"+(ll.get(removed)));
            ll.remove(removed--);   
        }   
        return ((Integer) ll.get(0)).intValue();   
    } 

打印结果:

436

436

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118457.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vb四环棋的实现,平面四子棋

    vb四环棋的实现,平面四子棋

    2021年3月12日
    236
  • 西门子s7300编程实例_西门子300编程入门

    西门子s7300编程实例_西门子300编程入门一、十字路口的交通指挥信号灯布置如下图:1、控制要求(1)信号灯系统由一个启动开关控制,当启动开关接通时,该信号灯系统开始工作,当启动开关关断时,所有信号灯都熄灭。(2)南北绿灯和东西绿灯不能同时亮。如果同时亮应关闭信号灯系统,并立刻报警。(3)南北红灯亮维持25s。在南北红灯亮的同时东西绿灯也亮,并维持20s。到20s时,东西绿灯闪亮,闪亮3s后熄灭,此时,东西黄灯亮,并维持…

    2025年10月23日
    6
  • administrator改名字_win10改了用户名无法登录

    administrator改名字_win10改了用户名无法登录网友求助:xp用administrator_XP系统修改administrator的用户名_xpadministrator问题不想添加多一个用户的办法?????????????????最佳答案说实话没有看懂题主的要求。我只能从你题面对描述,即将高级管理员帐户“Administrator”改变成其他名字来解答。要想将WindowsXP中要将默认的系统用户名改变成其他名称是可以实现的,但是需要调用“组…

    2022年10月14日
    4
  • CriticalSection_protection initialization

    CriticalSection_protection initialization如果EnterCriticalSection将一个线程置于等待状态,那么该线程在很长时间内就不能再次被调度。实际上,在编写得不好的应用程序中,该线程永远不会再次被赋予CPU时间。TryEnterCriticalSection函数决不允许调用线程进入等待状态。它的返回值能够指明调用线程是否能够获得对资源的访问权。TryEnterCriticalSection发现该资源已经被另一个线程访问,它就返回F

    2026年2月2日
    5
  • 大数据应用及其解决方案

    大数据应用及其解决方案1大数据概述 1.1.概述 大数据,IT行业的又一次技术变革,大数据的浪潮汹涌而至,对国家治理、企业决策和个人生活都在产生深远的影响,并将成为云计算、物联网之后信息技术产业领域又一重大创新变革。未来的十年将是一个“大数据”引领的智慧科技的时代、随着社交网络的逐渐成熟,移动带宽迅速提升、云计算、物联网应用更加丰富、更多的传感设备、移动终端接入到网络,由此而产生的数据及增长速度将…

    2022年6月2日
    41
  • 读TIJ -2 一切都是对象[通俗易懂]

    读TIJ -2 一切都是对象

    2022年1月25日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号