如何用递归分割数组

1 投票
3 回答
2304 浏览
提问于 2025-04-18 11:59

你好,我来解释一下我需要的东西。我想用递归的方法,把一个数组分成多个子数组,每个子数组再从中间分开。

举个例子,如果我有一个数组 a = [1, 2, 3, 4]

我想从中得到这样一个数组的数组:h = [[1,2], [3,4], [1], [2], [3], [4]]

我尝试了很多方法,觉得递归是最好的办法,但我还不知道该怎么做。

3 个回答

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{:}};
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]]

这样做不会按顺序生成子数组。我会使用一种循环的方法来实现这一点。

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

撰写回答