【问题标题】:Why doesn't this MATLAB simulation work?为什么这个 MATLAB 仿真不起作用?
【发布时间】: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


【解决方案1】:

我没有 100% 了解您正在尝试做的事情,但我认为您基本上忘记了更新“洗牌”套牌。您需要上一个牌组、当前牌组和目标牌组,但是您将上一个牌组和目标牌组用作单个变量w,但从未真正更新它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2011-04-06
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多