我一直在做家庭作业(这只是一部分),我必须递归地处理单元格数组,例如:
{1,{2,{5,{6,{}}}}}
我需要根据属性消除对象,即:
p=@(x)(x<3)
函数名称为filter_list(list,p)
,使用它的结果应为:
{1,{2,{}}}
代码是:
function [ list ] = filter_list( list,p )
if isempty(list)==1
disp('holo');
return;
else
if p(list{1})==0
disp('hola');
list(1)=list{2}(1);
list(2)=list{2}(2);
list{2}=filter_list(list{2},p);
else
disp('hele')
list{2}=filter_list(list{2},p);
end
end
但我得到的代码是:
{1,{2,{6,{}}}}
它只消除满足以下内容的数组的第一个元素:
p(list{1}) == 0
要求。
我该怎么做才能解决这个问题?另外,如果我使用大于4的数组,它也会崩溃。
答案 0 :(得分:1)
您需要递归调用该函数,
function [ list ] = filter_list( list,p )
for i = numel(list):-1:1 %Go through the cell backwards
if ~iscell(list{i}) %if the cell contains a scalar, vector or matrix
list{i}(~p(list{i})) = []; %if the number does not follow the rule specified by p remove it
if isempty(list{i}) %if there is nothing in the scalar/vector/matrix remove it
list(i) = [];
end
else %if the cell doesn't contain a number call the function again
list{i} = filter_list(list{i}, p);
end
end
end
答案 1 :(得分:1)
从列表中删除第一个元素的部分不正确。
而不是
list(1)=list{2}(1);
list(2)=list{2}(2);
list{2}=filter_list(list{2},p);
您应该使用:
list = filter_list(list{2},p);
如果你采用整体方法,可能会更清楚:
function list = filter_list(list, p)
if ~isempty(list)
if p(list{1})
list = {list{1}, filter_list(list{2}, p)}; %// Keep head of list
else
list = filter_list(list{2}, p); %// Only keep filtered tail
end
end
end