Also know as
Messages postés259Date d'inscriptionsamedi 13 décembre 2003StatutMembreDernière intervention22 novembre 2010
-
27 mai 2007 à 12:27
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
27 mai 2007 à 16:53
Bonjour,
Voilà je cherche à faire de la récursivité sous Delphi mais là j'avoue que je trouve ca un peu mal malheureusement...
Voci ma procedure :
procedure TForm1.ResoudreClick(Sender: TObject);
var
i: Integer;
x: Integer;
y: Integer;
begin
for y := 0 to 9 do
for x := 0 to 9 do
if (map.Cells[y,x] = '0') then
begin
for i := 0 to 9 do
begin
Test_lin_col(x, y, i);
Test_square(x, y, i); if ((lin_col True) and (square True)) then
begin
map.Cells[x,y] := IntToStr(i);
ResoudreClick(Sender);
map.Cells[x,y] := '0';
end;
end;
//return ; end;
end;
Là ou vous voyez le mot "return" c'est en C que la recursivité va se faire, il me manque l'équivalent en Delphi.
En effet s'il n'y a pas de possibilité alors il doit faire marche arrière GRACE à là recursivité !
Quelqu'un peut m'aider
@+
P.S.: Pour le moment je fais bien evidemment en StackOverflox (débordement de pile) à cause de ma fonction rappelée elle même : ResoudreClick(Sender); mais vu que je n'ai pas de récursivité c'ets normal
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 20131 27 mai 2007 à 12:40
j'ai pas regarder ton algo ms pour utiliser un equivalent en delphi faut pas utiliser procedure(une procedure ne renvoie rien) mais function et tu utilise result qui est equivalent du return
Also know as
Messages postés259Date d'inscriptionsamedi 13 décembre 2003StatutMembreDernière intervention22 novembre 20102 27 mai 2007 à 12:57
Merci !
J'ai donc un doute sur la récursivité sous Delphi.
Le but de la recursivité est de pouvoir s'appeler lui même, et de faire un conséqunce de ce qui c'est passé avant.
Exemple pour ce que je fais, la résolution d'un sudoku.
En C cela me donne cela :
int resolve(char **map)
{
int x;
int y;
int i;
for (y = 0; y < 9; y++)
for (x = 0; x < 9; x++)
if (map[y][x] == '0')
{
for (i = '1'; i <= '9'; i++)
if (test_col_lin(map, x, y, (i - '0')))
if (test_square(map, x, y, (i - '0')))
{
map[y][x] = i; if (x 8 && y 8)
return (aff(map));
else
if (resolve(map))
return (1);
map[y][x] = '0';
}
return (0);
} else if (x 8 && y 8)
aff(map);
return (1);
}
En fonction si ela retourne 0 ou pas, alors il va changer son comportement...
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 27 mai 2007 à 16:53
type
pMap = ^TMap;
TMap = array[0..8,0..8] of integer;
function TestColLin(const Map : pMap; const X,Y,I : integer) : boolean;
begin
//
end;
function TestSquare(const Map : pMap; const X,Y,I : integer) : boolean;
begin
//
end;
function Aff(const Map : pMap) : boolean;
begin
//
end;
function Resolve(const Map : pMap) : boolean;
var X,Y,I : integer;
begin
for y := 0 to 8 do
for x := 0 to 8 do
if Map^[y,x] = '0' then
begin
for i := 1 to 9 do
if TestColLin(Map, x, y, i) and TestSquare(Map, x, y, i) then
begin
Map^[y,x] = i; if (x 8) and (y 8) then
begin
result := Aff(Map);
exit;
end
else
if Resolve(Map) then
begin
result := true;
exit;
end;
Map^[Y,X] = 0;
end;
result := false;
exit;
end
else if (x 8) and (y 8) then
Aff(Map);
result := true;
end;