Das "Problem" ist, dass der Compiler intelligent ist und sieht, dass Result später eh gesetzt wird und diese Zeile quasi gar nicht ins Programm mit eincompiliert wird.
Delphi-Quellcode:
function TSudoku.SudokuBacktrack(row,col:integer):boolean;
var
zaehl:integer;
begin
if col = 8 then
begin
inc(row);
if row=8 then
begin
result:=false; // Selbst wenn du hier Result setzt
row:=1;
end;
col:=0;
end;
if SudokuFeld[row][col] > 0 then
result:=SudokuBacktrack(row, col+1);
for zaehl:=1 to 9 do
begin
if (CheckCol(Col,zaehl)) and (CheckRow(Row,zaehl)) and (CheckBlock(Row,Col,zaehl)) then
begin
SudokuFeld[row][col]:=zaehl;
if SudokuBacktrack(row, col+1) then
result:=true;
end;
end;
SudokuFeld[row][col]:=0;
result:=false; // Wird es hier überschrieben!
end;
Vielleicht sollte man hier noch erwähnen, dass ein
Result := <WERT>;
nicht dem
return von PHP/C/C++ etc. entspricht. Du musst für das Setzen und gleichzeitge verlassen der Methode zwei Zeilen aufrufen:
Seit Delphi XE ist auch folgendes möglich:
Exit(<WERT>);
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)