如何使用递归拆分数组

时间:2014-07-03 11:22:51

标签: python matlab

您好,我将解释我需要什么。我希望使用递归方法将数组拆分为分为每个子数组一半的子数组。

我的意思是,例如,如果我有一个数组a = [1,2,3,4]

我想从这个数组数组中获得:h = [[1,2],[3,4],[1],[2],[3],[4]]

我尝试多种方式,并认为递归是最好的方法,但我无法达到如何做。

3 个答案:

答案 0 :(得分:1)

在Python中:

>>> def split_array(array):
        if len(array) <= 1:
            return array
        else:
            return [array[:len(array)//2], array[len(array)//2:]]


>>> def halves(array):
        if len(array) <= 1:
            return [array]
        else:
            parts = split_array(array)
            return [array] + halves(parts[0]) + halves(parts[1])


>>> halves([1, 2, 3, 4])
[[1, 2, 3, 4], [1, 2], [1], [2], [3, 4], [3], [4]]
>>> halves([1, 2, 3, 4])[1:]
[[1, 2], [1], [2], [3, 4], [3], [4]]

这不会按顺序生成子阵列。我会使用迭代方法。

答案 1 :(得分:0)

在Matlab中,使用单元格,仅用于偶数长度的数组

a = [1, 2, 3, 4]
b= a(1:numel(a)/2);
c= a(numel(a)/2+1:end); 
d= num2cell(a);
%
O={b,c,d{:}};

读取值:

O{i} with i={1,...,6}

修改 对于奇数和偶数长度的数组(但对于奇数加长的数组,您需要根据所需的分割调整r的值)

a = [1, 2, 3, 4, 5]
r = floor(numel(a)/2);
b= a(1:r);
c= a(r+1:end); 
d= num2cell(a);
%
O={b,c,d{:}};

答案 2 :(得分:0)

这是一个Matlab解决方案(注意将这两个函数放在一个名为split_array.m的文件中):

function O = split_array(I)
% Wrapper function to sort the output of the recursive output
    O = split_array_R(I);
    [~,ind] = sort(cellfun(@numel, O), 'descend');
    O = O(ind);
end

function O = split_array_R(I, I1, I2)

    if ~iscell(I)
        n = ceil(numel(I)/2);
        I1 = I(1:n);
        I2 = I(n+1:end);
        I = {I};
    end;

    if numel(I1) > 1
        O1 = split_array_R(I1);
    else
        O1 = {I1};
    end

    if numel(I2) > 1
        O2 = split_array_R(I2);
    else
        O2 = {I2};
    end

    O = {I{:}, O1{:}, O2{:}};
end