一个排列组合问题的解法

    技术2022-05-20  60

          给出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

          运行结果:


    最新回复(0)