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

时间:2018-03-13 12:25:26

标签: matlab

我想模拟游戏":

从一组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)。

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

1 个答案:

答案 0 :(得分:0)

我不会100%得到你正在尝试的东西,但我认为基本上你忘记更新“洗牌”套牌。您需要前一个套牌,当前套牌和目标套牌,但是您将前一个和目标套牌用作单个变量w,但从未真正更新它。

如果您声明变量init,并替换w中的tf=isequal(v,init);,请在其后添加额外的行以更新前一个套牌w=v;,那么此代码不会不会陷入无限循环。