Récursivité ???

Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 - 27 mai 2007 à 12:27
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 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

@+

6 réponses

Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 2
27 mai 2007 à 12:28
Oups une petite erreur c'est gilssée :

  for x := 0 to 9 do
    for y := 0 to 9 do
      if (map.Cells[ x,y ] = '0') then

Voilà d'ou venait mon problème de pile

Mais bon cela ne change rien à mon problème bien evidemment.

@+
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 2
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

Ciao
0
Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 2
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...

@+
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 2
27 mai 2007 à 13:02
aucune raisons que la recursivite sous delphi ne marche pas !

Ciao
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Also know as Messages postés 259 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 22 novembre 2010 2
27 mai 2007 à 13:04
En effet mais alors il va falloir me l'expliquer, parceque là sous Delphi je ne vois pas comment faire

@+
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
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;




<hr size="2" width="100%" />
Croc (click me)
0