• Javascript 实现的约瑟夫环


    前几天使用 PHP 实现了约瑟夫环问题,使用的是 PHP 数组内部指针的各种操作来实现的,于是想用 JS 来实现一下,实现之前当然要自己来编写一些 JS 数组内部指针的操作函数,就像:reset(), current(), next(), prev(), search(), end() 这些函数,我们都要来自己实现,因为 JS 没有内置这些神奇的操作函数,下面来看代码:

    Array.prototype.pointer = 0;//模拟数组内部指针
    //Reset 函数,将数组内部指针归位(指向第一个元素)
    var reset = function(arrayObj){
    	if(!(arrayObj instanceof Array)){
    		alert("Reset() 函数参数类型错误!请检查输入!");
    		return;
    	}
    	arrayObj.pointer = 0;
    }
    //Current 函数,返回数组内部指针指向的当前元素
    var current = function(arrayObj){
    	if(!(arrayObj instanceof Array)){
    		alert("Current() 函数参数类型错误!请检查输入!");
    		return;
    	}
    	return arrayObj[arrayObj.pointer];
    }
    //End 函数,将数组内部指针指向最后一个元素
    var end = function(arrayObj){
    	if(!(arrayObj instanceof Array)){
    		alert("End() 函数参数类型错误!请检查输入!");
    		return;
    	}
    	arrayObj.pointer = arrayObj.length - 1;
    	return arrayObj[arrayObj.pointer];
    }
    //Next 函数,将数组内部指针下移一位,如果已经指向最后一个元素则返回 FALSE
    var next = function(arrayObj){
    	if(!(arrayObj instanceof Array)){
    		alert("Next() 函数参数类型错误!请检查输入!");
    		return;
    	}
    	arrayObj.pointer ++;
    	if(typeof arrayObj[arrayObj.pointer] == 'undefined'){
    		arrayObj.pointer --;
    		return false;
    	}
    	return true;
    }
    //Prev 函数,将数组内部指针上移一位,如果已经指向第一个元素则返回 FALSE
    var prev = function(arrayObj){
    	if(!(arrayObj instanceof Array)){
    		alert("Prev() 函数参数类型错误!请检查输入!");
    		return;
    	}
    	arrayObj.pointer --;
    	if(typeof arrayObj[arrayObj.pointer] == 'undefined'){
    		arrayObj.pointer ++;
    		return false;
    	}
    	return arrayObj[arrayObj.pointer];
    }
    //Unset  函数,删除指定的数组元素
    var unset = function(index, arrayObj){
    	if(!(arrayObj instanceof Array)){
    		alert("Unset() 函数参数类型错误!请检查输入!");
    		return;
    	}
    	if(typeof arrayObj[index] == 'undefined'){
    		alert("Unset() 函数参数 index 错误!不存在此元素!");
    		return false;
    	}
    	arrayObj.splice(index, 1);
    	return true;
    }
    //Search 函数,通过数组键值返回数组的键名
    var search = function(value, arrayObj){
    	if(!(arrayObj instanceof Array)){
    		alert("Search() 函数参数类型错误!请检查输入!");
    		return;
    	}
    	for(index in arrayObj){
    		if(arrayObj[index] == value){
    			return index;
    		}
    	}
    	return false;
    }
    //getKingMonkey 函数,我们的约瑟夫主函数,n 只猴子,数到 m
    function getKingMonkey(n, m){
    	a = new Array();
    	for(i = 1; i <= n; i ++){
    		a[i] = i;
    	}
    	a[0] = 0;unset(0, a);reset(a);
    	while(a.length > 1){
    		for(counter = 1; counter <= m; counter ++){
    			if(next(a)){
    				if(counter == m){
    					unset(search(prev(a), a), a);
    				}
    			}else{
    				reset(a);
    				if(counter == m){
    					unset(search(end(a), a), a);
    					reset(a);
    				}
    			}
    		}
    	}
    	return current(a);
    }
    alert("猴子大王的编号为:" + getKingMonkey(100, 17));

    来看看显示结果:

    约瑟夫环

  • 相关阅读:
    Adobe Flex初记
    将获得datebox值的文本形式转为日期格式
    Java代码中获取Json的key值
    SortedMap与TreeMap的一个典型应用
    上传本地代码到github&&从github下载源码
    springMVC第一课--配置文件
    MySQL视图的优缺点以及如何创建视图
    一张图看懂IaaS, PaaS和SaaS的区别
    二十三种设计模式-六大原则
    数据库设计三大范式
  • 原文地址:https://www.cnblogs.com/catprayer/p/1845861.html
Copyright © 2020-2023  润新知