您的位置:首页 > 编程语言 > MATLAB

一个排列组合问题的解法

2011-02-28 23:58 309 查看
      给出N个集合(例如{1}、{2,5}、{3,5},N = 3),若在每个集合中每次取一个数,组成一个新的集合,如何求出所有这样的集合呢(如上面例子的结果为{1,2,3} 、{1,2,5}、{1,5,3}、{1,5,5})?下面给出了解决该问题的Matlab递归算法实现。

      Choose.m

function [ ret ] = Choose( sets )
% 输入参数:
% sets 胞元数组类型,数组中每个元素为一个数列集合,类型为一个一维向量,例如 [ 2 3 4 ]
% 输出参数:
% ret 胞元数组类型,数组中每个元素为一个数列集合,即问题的求解结果

nSetLength = length( sets );

% 若输入集合仅有一个
if 1 == nSetLength
nSetOneLen = length( sets{ 1 } );
ret = cell( 1, nSetOneLen );

for i = 1 : length( sets{ 1 } )
ret{ i } = sets{ 1 }( i );
end
% 否则将第一个集合,与剩下的集合排列结果,再进行排列组合
else
% 递归调用自身
result = Choose( sets( 2 : end ) );
nSetOneLen = length( sets{ 1 } );
nRetLen = length( result );
ret = cell( 1, nSetOneLen * nRetLen );

for i = 1 : nSetOneLen
for j = 1 : nRetLen
ret{ ( i - 1 ) * nRetLen + j  } = [ sets{ 1 }( i ) result{ j } ];
end
end
end

end


      Rum.m

set = { [ 1 ], [ 2 5 ], [ 7 8 ], [ 3 1 ] };
result = Choose( set );

disp( '排列组合结果为:' );
for i = 1 : length( result )
disp( num2str( result{ i } ) );
end


      运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab 算法