js 约瑟夫 问题 解.

偶然看到技术群里 发出这么一个问题

 n 个人围成一圈, 从1到3开始报数,  报到 3 的人 退出游戏. 问,最后一个留下来的人是 最开始的 谁?

觉得挺有意思的, 就自己写了一段:

/**
 * @param {Object} n  围成圈的人数
 * @param {Object} m  报数最大值
 * 
 * n 个人围成一圈, 从1到m开始报数,  报到 m 的人 退出游戏. 问,最后一个留下来的人是 最开始的 谁?
 */
function getPeople(n,m) {
	var group = [];// 定义数组
	for (var i = 0; i < n; i++) {
		group[i] = i + 1;//数组赋值 从1 开始
	}
	var number = 1; // 定义 报的 数
	var groupLen = group.length; // 总人数
	for (var i = 0; i < i+1; i++) { // 死循环, 知道游戏结束
		if (number == m) { // 喊到 m 的人
			group.splice(i, 1); // 退出游戏
			number = 0; // 接着开始报数
			groupLen--; // 总人数 -1
			i--; // 退出一个人后, i 也需要 --
		}
		if (groupLen == i + 1) { // 当 总人数, 和 循环的 i 相同时, 开始新一轮 报数
			i = -1; // 定义为 -1 , for 循环定义的 i++ 会让值变成0
		}
		if(group.length == 1){// 当 只剩下一个人时, 退出游戏
			break;
		}
		number++;
	}
	console.log("获胜者是:" + group[0])
}

利用 死循环 以及 达到最大值后, 初始化 i 的方法.很容易就可以解答这个问题.

猜你喜欢

转载自blog.csdn.net/qq_37802298/article/details/90080998