현재 3D 퍼즐을 해결해야하는 알고리즘을 연구 중입니다. 그러나 문제가 발생했습니다. 사용하는 알고리즘은 첫 번째 검색 심도이며 "STORAGE_ERROR 제기 : EXCEPTION_STACK_OVERFLOW"까지는 제대로 작동하는 것 같습니다. 왜 그것이 작동하지 않는지 나는 잘 모르겠다. 왜 이것이 작동하지 않는지 추측 할 수 있습니까?저장 오류 - 최초 심도 검색 알고리즘
이 알고리즘에서 수행하고자하는 것 : 목록, 그림 및 목표를 취합니다. 이 예제의 경우 목록은 7 부분입니다. 그것은 첫 번째 조화에있는 부분을 입력하려고 시도합니다. 적합하지 않을 때까지 회전하고, 나머지 부분 (6 개 부분)으로 자기 자신을 호출합니다. 파트가 24 가지 방식으로 회전하면 (3D 파트를 회전 할 수있는 가능한 모든 방법) 다른 좌표로 이동하고 다시 시도하기 시작합니다. 모든 부품이 사라지거나 아무 것도 작동하지 않으면 그냥 종료해야하며이 알고리즘에 다른 순서로 같은 목록에서 보내는 다른 알고리즘이 있습니다.
마지막 좌표가 목표와 일치하지 않는지 확인하는 알고리즘을 원한다면 그냥 다시 추적하고 다른 솔루션을 찾으십시오.
procedure Pseudo(Parts : in out List_Type; Figure : in out Figure_Type; Goal : in out Figure_Type; LastCoord : in out Integer) is
Unchanged : Part_Type := Parts.Data;
Next : boolean := False;
UnchangedFigure : Figure_Type;
begin
UnchangedFigure := Figure;
if Empty(Parts) then
raise Finished;
else
for I in 1..24 loop
RotNumber(Parts.Data,I); -- rotera
if Check(Parts.Data,Figure) then -- test om den platsar
Maincheck(Parts.Data,Figure,Goal,Next);
if Next then
Unchanged := Parts.Data;
Append_Part(Parts.Data,Figure);
Remove_First(Parts);
Next := False;
Pseudo(Parts,Figure,Goal,LastCoord);
Next := False;
Figure := UnchangedFigure;
Insert_First(Unchanged,Parts);
Figure.CoordX := 0;
Figure.CoordY := 0;
Figure.CoordZ := 0;
end if;
end if;
Parts.Data := Unchanged;
end loop;
end if;
-- if LastCoord /= 7 then --(Original
-- if To_String(Figure.Data)(LastCoord) /= To_String(Goal.Data)(LastCoord) then
-- Put("over");
-- return;
-- end if;
-- end if;
LastCoord := Figure.CoordZ*Figure.X*Figure.Y + (Figure.Y-Figure.CoordY-1)*(Figure.X) + Figure.CoordX +1;
if Figure.CoordY < Figure.Y-1 then
Figure.CoordY := Figure.CoordY +1;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordY = Figure.Y-1 then
if Figure.CoordX < Figure.X-1 then
Figure.CoordX := Figure.CoordX +1;
Figure.CoordY := 0;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordX = Figure.X-1 then
if Figure.CoordZ < Figure.Z-1 then
Figure.CoordZ := Figure.CoordZ +1;
Figure.CoordX := 0;
Figure.CoordY := 0;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordZ = Figure.Z-1 then
return;
end if;
end if;
end if;
end Pseudo;
내 머리 꼭대기에서 막 재귀가 제대로 종료되고 있는지 확인하는 것이 좋습니다. Out of control 재귀는 스택을 날려 Storage_Error를 발생시키는 쉬운 방법입니다. –
안녕하세요, 저는 당신이 옳았다 고 생각합니다. 아마 어딘가에서 무한 재귀 였을 것입니다. 그러나 나는 가능한 "분지"의 미친 양 때문에 예정대로 작동하는지 아직도 확실하지 않다. – user2207734
@ user2207734 인 경우 분기하는 방식을 검토해야합니다. – Alexander