为什么这个 MATLAB 仿真不起作用?



我想模拟一个"游戏":

从一副 N 张不同的牌开始,比如一个向量 (1 2 ...将其分成两个同样大的半甲板,保持初始顺序;如果 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(。

然后应该重复此步骤。"游戏"是找出需要多少次迭代才能回到初始设置(好吧,假设它总是发生,情况似乎是这样(。我已经编写了这个程序,但它陷入了无限循环。怎么了?例如,如果没有错误,它应该很容易返回 move=3 的 n=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

我不明白 100% 你想做什么,但我认为基本上你忘记更新"洗牌"甲板。您需要前一副牌、当前套牌和目标套牌,但是您将前一副牌和目标套牌用作单个变量w,但从未真正更新过它。

如果你声明一个变量init,并在tf=isequal(v,init);中替换w,添加一个额外的行来更新前一副牌,w=v;之后,那么这段代码就不会陷入无限循环。

最新更新