欢迎光临散文网 会员登陆 & 注册

北太天元的perms给出所有排列的函数帮助我确认高中数学教辅答案的错误

2023-07-13 17:05 作者:卢朓  | 我要投稿

% 7 个人进行了编号,1号和2号是新冠患者,3,4,5,6,7是健康的

%

a = 1:7;

V= perms(a);

[n,~] = size(V);

% 恰好第5次把两个患者都检测出来的情况进行计数

s5 =0;

for i=1:n

   if (V(i,5) == 1 || V(i,5) == 2 ) && V(i,6) > 2 && V(i,7) >2

      % 1或者2号排在第5位,第6位和第7位是健康者,这就是一个恰好第5次检测出两个患者的情况

      s5 = s5+1;

   end

end


% 得出恰好第五次检测出两个患者的概率

s5/factoral(7)


% 把一个向量的所有排列都给出来

% 例 perms ([1, 2, 3])

%  3  2  1

%  3  1  2

%  2  3  1

%  2  1  3

%  1  3  2

%  1  2  3

%

function A = perms (v)


 if (nargin < 1)

   help perms

      return

 end


 v = v(:).';

 if (isnumeric (v) || ischar (v))

   v = sort (v, "ascend");

 end

 n = numel (v);


 if (n < 4)   % 对于n比较小时,单独处理

   switch (n)

     case 0

       A = reshape (v, 1, 0);

     case 1

       A = v;

     case 2

       A = [v([2 1]);v];

     case 3

       A = v([3 2 1; 3 1 2; 2 3 1; 2 1 3; 1 3 2; 1 2 3]);

   end

 else

   v = v(end:-1:1);

   n = n-1;


   idx = zeros (factorial (n), n);

   idx(1:6, n-2:n) = [1, 2, 3;1, 3, 2;2, 1, 3;2, 3, 1;3, 1, 2;3, 2, 1]+(n-3);

   f = 2;   % jump-start for efficiency with medium n

   for j = 3:n-1

     b = 1:n;

     f = f*j;

     perm = idx(1:f, n-(j-1):n);

         tmp = n-j:n;

         tmpA = tmp(ones(f,1),:);

     idx(1:(j+1)*f, n-j) = tmpA(:);

     for i=0:j

       b(i+n-j) = b(i+n-j) - 1;

       idx((1:f)+i*f, n-(j-1):n) = b(perm);

     end

   end


   n = n + 1;

   f = f*(n-1);

      tmpC = v(1);

   A = tmpC(ones (factorial (n), n));

      tmpD = v(ones(f,1),:);

   A(:,1) = tmpD(:);


   for i = 1:n

     b = v([1:i-1 i+1:n]);

     A((1:f)+(i-1)*f, 2:end) = b(idx);

   end

 end


end



北太天元的perms给出所有排列的函数帮助我确认高中数学教辅答案的错误的评论 (共 条)

分享到微博请遵守国家法律