MATLAB で「 Sprague–Grundy の定理」を実装しようとしています。この定理は基本的に、配列内の最小の除外要素を見つけようとします。たとえば、配列 [0 1 3 4 5] では、値は 2 になります。さらに、関数は、配列内の異なる行に沿って再帰できる必要があります。行列 (具体的には、グラフ理論からの隣接行列) たとえば、隣接行列があるとします。
10000
10000
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 番目に再帰します。
私が問題を抱えているのは、関数入力がmatrix/arrayである再帰を行うことです。関数入力が整数の場合、再帰は十分に単純だと思いますが、行列/配列では、値を「追跡」して必要な最終配列を取得する方法がわかりません。これまでのところ、これは私の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