% 北大數(shù)學(xué)揭秘劉謙魔術(shù), 它實(shí)際上是約瑟夫(josephus)問題的一個(gè)特例
% 北太天元給出一般的約瑟夫問題的求解
% 例如
% 男生對(duì)應(yīng)的是 josephus(7,2), 目標(biāo)牌在第7個(gè),因此
% josephus(7,2) 看到退出的牌的次序是 2 4 6 1 5 3 7 ,
% 恰好最后一張牌是 7
% 男生對(duì)應(yīng)的是 josephus(6,2) , 目標(biāo)牌在第五個(gè)
% 女生對(duì)應(yīng)的是 josephus(5,2) , 目標(biāo)牌X 在第三個(gè)
function result = josephus(n, m)
if(nargin <2)
n = 7;
m =2;
end
if n < 1 || m < 1
result = [];
return;
end
% 創(chuàng)建一個(gè)1到n的向量表示圍成一圈的人
people = 1:n; % 編號(hào)從0到n-1
result = []; % 用于存儲(chǔ)每次出圈人的順序
index = 1; % 從第一個(gè)人開始報(bào)數(shù)
while ~isempty(people) % 當(dāng)還有人在圈中時(shí)
% 計(jì)算要移除的人的索引位置(考慮循環(huán)計(jì)數(shù)的特性)
index = mod(index - 1 + m, length(people));
if(index == 0)
index = length(people);
end
% 將出圈的人添加到結(jié)果中,并從圈中移除
result = [result, people(index)];
people(index) = [];
end
end
聲明:當(dāng)年跟老師一塊弄的。
