There is a link to a Matlab sudoku solver here: Matlab Sudoku Solver (shown below). I wrote my own solver (shown below) and I get "recursion error" when it runs. It's basically the exact same thing with different variable names. Why does my code get a recursion error while the code in the link doesn't? Thanks!
Matlab Code
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
My Code
function X=SD(X) % 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] = candidate(X); while ~isempty(s) && isempty(e) X(s) = C{s}; [C,s,e] = candidate(X); end % Return for impossible puzzles.
if ~isempty(e) return end % Recursive Backtracking
if any(X(:) > 0) Y=X; [row,col]=find(X==0,1,'first'); for k=1:length(C{col,row}) X=Y; X(col,row)=C{col,row}(k); X=SD(X); if all(X(:)>0) return end end end function [C,s,e]=candidate(X) C=cell(9,9); for j=1:9 for i=1:9 % remove numbers already in current row/column
p=1:9; t1=nonzeros(X(j,:)); t2=nonzeros(X(:,i)); % remove numbers already in current minor matrix
t3=nonzeros(X(3*ceil(j/3)-2:3*ceil(j/3),3*ceil(i/3)-2:3*ceil(i/3))); p(nonzeros([t1' t2' t3']))=0; C{j,i}=nonzeros(p); end end L = cellfun(@length,C); s = find(X==0 & L==1,1); e = find(X==0 & L==0,1); end end
Best Answer