我正在尝试实施" Sprague–Grundy theorem"在MATLAB中。这个定理本质上试图找到数组中的最小被排除元素,例如在数组[0 1 3 4 5]中,该值为2.除此之外,该函数需要能够沿着不同的行递归。矩阵(具体来自图论的邻接矩阵)例如,如果我有邻接矩阵:
1 0 0 0 0
1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
0 0 1 0 0
如果我使用这个矩阵作为输入,并且函数从第5行开始,那么它将遍历行" 0 0 1 0 0"当它看到第3列中的1时,该函数将递归到第3行,然后递归到第4行,然后是第2行,然后是第1行。
我遇到的麻烦是进行递归,其中函数输入是矩阵/数组。我认为当函数输入是一个整数时递归很简单,但是使用矩阵/数组我不知道如何保持"保持"跟踪值并获得我想要的最终数组。到目前为止,这是我的matlab代码:
function [ y ] = S_Grundy( X,r,m )
% Recursively finds the SG value given an adj matrix,
Row_ones = find(X(r,:) == 1)
y=0.*size(Row_ones,2);
% if(numel(Row_ones)==0)
% y(:)=0;
% return
% end
for i=1:size(Row_ones,2)
if(Row_ones(i) >= m)
y = S_Grundy(X,Row_ones(i),m);
end
end
if (Row_ones(i) < m)
for j=0:max(Row_ones)
if(isempty(find(Row_ones==j)));%&&(isempty(find(Row_ones==0))))
y(i)=j;
else
y(i)=777;
% if(isempty(find(Row_ones==j)))
% y(i)=j;
% end
end
end
end
end
答案 0 :(得分:0)
所以,为了重新解释你的问题,你试图找到一个具有最小索引的顶点,这样它就不能从起始顶点到达,这是正确的吗?
我根本不会使用递归;我逐渐建立了到目前为止到达的顶点可到达的顶点集,直到我找不到为止。
graph = [1 0 0 0 0; 1 0 0 0 0; 0 0 0 1 0; 0 1 0 0 0; 0 0 1 0 0]
start = 5
component = graph(start, :)
lastcomponent = zeros(1, 5)
while (sum(component) > sum(lastcomponent))
lastcomponent = component
component = sign(sum(graph(find(component == 1), :), 1) + lastcomponent)
endwhile
result = min(find(component == 0))
(有人可能写得更好,我没有专业的matlab。但你应该明白这个想法)