How do I modify this code so it counts how many times the recursive function is called upon?
5 ビュー (過去 30 日間)
古いコメントを表示
I'm working on a project to evaluate different sudoku, but I would like to be able to count how many times this recursive function is called upon for each sudoku. wondering if you could help me modify it so it uses a global variable to do so. Here the function I'm currently using?
function X = sudoku(X)
% SUDOKU Solve Sudoku using recursive backtracking.
% sudoku(X), expects a 9-by-9 array X.
% Fill in all “singletons”.
% C is a cell array of candidate vectors for each cell.
% s is the first cell, if any, with one candidate.
% e is the first cell, if any, with no candidates.
[C,s,e] = candidates(X);
while ~isempty(s) && isempty(e)
X(s) = C{s};
[C,s,e] = candidates(X);
end
% Return for impossible puzzles.
if ~isempty(e)
return
end
% Recursive backtracking.
if any(X(:) == 0)
Y = X;
z = find(X(:) == 0,1); % The first unfilled cell.
for r = [C{z}] % Iterate over candidates.
X = Y;
X(z) = r; % Insert a tentative value.
X = sudoku(X); % Recursive call.
if all(X(:) > 0) % Found a solution.
return
end
end
end
% ------------------------------
function [C,s,e] = candidates(X)
C = cell(9,9);
tri = @(k) 3*ceil(k/3-1) + (1:3);
for j = 1:9
for i = 1:9
if X(i,j)==0
z = 1:9;
z(nonzeros(X(i,:))) = 0;
z(nonzeros(X(:,j))) = 0;
z(nonzeros(X(tri(i),tri(j)))) = 0;
C{i,j} = nonzeros(z)’;
end
end
end
L = cellfun(@length,C); % Number of candidates.
s = find(X==0 & L==1,1);
e = find(X==0 & L==0,1);
end % candidates
end % sudoku
0 件のコメント
回答 (2 件)
Guillaume
2019 年 3 月 6 日
You could also not bother with the persistent variable and just pass the count as input/output:
function [X, count] = sudoku(X, count)
if nargin < 2
count = 0;
else
count = count + 1;
end
%... rest of the code that leads to the recursive call
[X, count] = sudoku(X, count);
end
0 件のコメント
Matt J
2019 年 3 月 5 日
編集済み: Matt J
2019 年 3 月 5 日
Use a persistent counter variable:
function [X,count] = sudoku(X, restart)
persistent count
if nargin<2, restart=false; end
if isempty(count) || restart,
count=1;
else
count=count+1;
end
[C,s,e] = candidates(X);
.... %the rest of your code
4 件のコメント
Guillaume
2019 年 3 月 6 日
It's much better if you just copy/paste the full text of the error rather than giving us a (misspelled) interpretation of it.
Assuming that the error is what I think it is, it is still true in the latest version of matlab. The persistent variable must be declared before it's used, and it can't be an output variable. So, while Matt's answer explained the correct concept, the actual execution is a bit off.
function [X, count] = sudoku(X, restart)
persistent internalcount; %can't be a return variable
if isempty(internalcount) || restart
internalcount = 1;
else
internalcount = internalcount + 1;
end
%... rest of the code
count = internalcount;
end
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!