How do I fix my Nan issue within a recursive function?

For my recursive function, I am trying to create a hexadoku solver. One of my variables 'mm' keeps outputting a NaN even when I try to change the NaNs into -1. I also believe that there is a base I am missing in order for this function to end. I do realize that the readmatrix function will output a NaN where there isn't an integer, but that is why there is the M(isnan(M)) = -1.
M = readmatrix("puzzle_1.in","FileType","text");
M(isnan(M)) = -1;
S = zeros(size(M));
Hexadoku(M,S)
function [S] = Hexadoku(M,S)
if ~exist('S')
S = zeros(size(M));
end
FirstID = M==-1;
if isempty(FirstID)
M = S(:,:,size(S,4)+2);
else
[i,j] = ind2sub([16,16],FirstID);
for k = 1:16
ii = (ceil(i/4)-1)*4+5;
jj = (ceil(j/4)-1)*4+1;
mm = M(ii:ii+3,jj:jj+3);
mm(isnan(mm)) = -1;
if (M(i+1,:)==k)==0
if (M(:,j)==k)==0
if (mm(:)==k)==0
M(i+1,j) = k;
S = Hexadoku(M,S);
end
end
end
end
end
end

답변 (1개)

Stephen23
Stephen23 2024년 4월 29일
편집: Stephen23 2024년 4월 29일
Replace this (which returns logical indices):
FirstID = M==-1;
with this (which returns the linear index):
FirstID = find(M==-1,1,'first');
Note that:
  • FIND can also return row&column subscript indices (i.e. you probably do not need IND2SUB).
  • Using NARGIN is more efficient than EXIST.
  • Your IF-statements if ...==0 will only be considered as TRUE when all elements are non-zero. This is unlikely to be the case. You probably require ANY or ALL to clarify what behavior you require, otherwise your code is very unlikely to be doing what you expect.

댓글 수: 4

While this does give a different answer, that answer is a recursion error. Matlab says that the error could be cuased by:
[i,j] = ind2sub([16,16],FirstID);
I am guessing it would be because of the ind2sub function.
Stephen23
Stephen23 2024년 4월 29일
편집: Stephen23 2024년 4월 29일
"While this does give a different answer, that answer is a recursion error."
In most cases recursion errors occur because the user has not defined clear conditions to end the recursion, or they simply call their own function inside itself without understanding what that does.
"Matlab says that the error could be cuased by: I am guessing it would be because of the ind2sub function."
It would be highly unusual for IND2SUB to cause infinite recursion, unless you have defined your own IND2SUB somewhere. If you want help debugging this then please post the complete error message and the complete current code that you are running.
I believe I am incorrect with how the 'ii', 'jj', and 'mm' variables work. This is the script:
M = readmatrix("puzzle_1.in","FileType","text");
M(isnan(M)) = -1;
S = zeros(size(M));
Hexadoku(M,S)
function [S,Mout] = Hexadoku(M,S)
if nargin == 1
S = zeros(size(M));
end
FirstID = find(M==-1,1,"first");
if M ~= -1
Mout = M(:,:);
else
[i,j] = find(FirstID == 1);
for k = 1:16
ii = (ceil(i/4)-1)*4+5;
jj = (ceil(j/4)-1)*4+1;
mm = M(ii:ii+3,jj:jj+3);
mm(isnan(mm)) = -1;
if all(M(i,:)==k)
if all(mm(:)==k)
M(i,j) = k;
S = Hexadoku(M,S);
end
end
end
end
end
This is the error:
Out of memory. The likely cause is an infinite recursion within the program.
Error in HexadokuTest>Hexadoku (line 23)
S = Hexadoku(M,S);
Stephen23
Stephen23 2024년 4월 29일
편집: Stephen23 2024년 4월 29일
So check your stopping conditions: are they ever fulfilled?
(When I write "check" I do not mean "rely on what you believe your code is doing", I actually mean check the recursive function calls for its input valus and the stopping conditions. For example, a good start is to print them to the command window. A much better approach is to use the debugger.)

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품

릴리스

R2024a

질문:

2024년 4월 29일

편집:

2024년 4월 29일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by