如何用递归分割数组
你好,我来解释一下我需要的东西。我想用递归的方法,把一个数组分成多个子数组,每个子数组再从中间分开。
举个例子,如果我有一个数组 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