% 北大数学揭秘刘谦魔术, 它实际上是约瑟夫(josephus)问题的一个特例
% 北太天元给出一般的约瑟夫问题的求解
% 例如
% 男生对应的是 josephus(7,2), 目标牌在第7个,因此
% josephus(7,2) 看到退出的牌的次序是 2 4 6 1 5 3 7 ,
% 恰好最后一张牌是 7
% 男生对应的是 josephus(6,2) , 目标牌在第五个
% 女生对应的是 josephus(5,2) , 目标牌X 在第三个
function result = josephus(n, m)
if(nargin <2)
n = 7;
m =2;
end
if n < 1 || m < 1
result = [];
return;
end
% 创建一个1到n的向量表示围成一圈的人
people = 1:n; % 编号从0到n-1
result = []; % 用于存储每次出圈人的顺序
index = 1; % 从第一个人开始报数
while ~isempty(people) % 当还有人在圈中时
% 计算要移除的人的索引位置(考虑循环计数的特性)
index = mod(index - 1 + m, length(people));
if(index == 0)
index = length(people);
end
% 将出圈的人添加到结果中,并从圈中移除
result = [result, people(index)];
people(index) = [];
end
end
声明:当年跟老师一块弄的。