【发布时间】:2018-03-13 21:49:50
【问题描述】:
我想模拟一个“游戏”:
从一副包含 n 个不同卡片的卡片开始,比如一个向量 (1 2 ... n)。把它分成两个同样大的半甲板,保持最初的顺序;如果 n 是奇数,则将其分隔为 (1 2 ... (n-1)/2) 和 ((n+1)/2 (n+1)/2+1 ... n)。
然后将它们混合,使新牌组最下方的牌位于第一个半牌组的最下方,然后放入第二个半牌组的最下方,然后是第一个半牌组的第二个最下方的牌,以此类推。如果 n 是奇数,则得到:
( (n+1)/2 (n+1)/2+1 1 (n+1)/2+2 2 (n+1)/2+3 3 ... n (n-1) /2)。
然后应该重复此步骤。 “游戏”是找出需要多少次迭代才能回到初始设置(好吧,假设它总是发生,似乎就是这种情况)。我已经编写了这个程序,但它陷入了无限循环。它出什么问题了?例如,对于 n=3,它应该很容易返回moves=3,没有错误。
n=input('How many cards in total?\n');
v=zeros(1,n);
i=1;
moves=0;
for i=1:n
v(i)=i;
end
w=v;
if mod(n,2)==0
for i=1:2:n-1
v(i)=w(n/2+(i+1)/2);
end
for i=2:2:n
v(i)=w(i/2);
end
moves=moves+1;
else v(1)=w((n+1)/2);
for i=3:2:n
v(i)=w((i-1)/2);
end
for i=2:2:n-1
v(i)=w((n+1)/2+i/2);
end
moves=moves+1;
end
tf=isequal(v,w);
while(tf==0)
if mod(n,2)==0
for i=1:2:n-1
v(i)=w(n/2+(i+1)/2);
end
for i=2:2:n
v(i)=w(i/2);
end
moves=moves+1;
else
v(1)=w((n+1)/2);
for i=3:2:n
v(i)=w((i-1)/2);
end
for i=2:2:n-1
v(i)=w((n+1)/2+i/2);
end
moves=moves+1;
end
tf=isequal(v,w);
end
【问题讨论】:
-
我建议你在
tf=..之后添加disp(v)你可以看到会发生什么(v永远不会改变)
标签: matlab