Chapter 2 10 Recursive Algorithms and Backtracking J
Chapter 2. 10 Recursive Algorithms and Backtracking J. Tiberghien
Recursive Algorithms Factorial • Step-up function : Fac(n) = (n)*Fac(n-1) • Trivial solution : Fac(1) = 1 • Recursive procedure : PROCEDURE BEGIN IF n > THEN ELSE END (* END Fac; Fac(n: CARDINAL): CARDINAL; 1 RETURN n*Fac(n-1) RETURN 1 IF *) J. Tiberghien
Recursive Algorithms Factorial • Alternative Iterative Procedure : PROCEDURE Fac(n: CARDINAL): CARDINAL; VAR f : CARDINAL; BEGIN f : = 1; WHILE n > 1 DO f : = f * n ; n : = n - 1 END; (* WHILE *) RETURN f END Fac; J. Tiberghien
Recursive Algorithms Fibonaci • Step-up function : Fib(n) = Fib(n-1)+Fib(n-2) • Trivial solution : Fib(1) = 1; Fib(0) = 0 • Recursive procedure : PROCEDURE Fib(n: CARDINAL): CARDINAL; BEGIN IF n > 1 THEN RETURN Fib(n-1)+Fib(n-2) ELSIF n=1 THEN RETURN 1 ELSE RETURN 0 END (* IF *) END Fib; J. Tiberghien
Recursive Algorithms Fibonaci • Alternative Iterative Procedure : PROCEDURE Fib(n: CARDINAL): CARDINAL; VAR i, fnm 1, fnm 2 : CARDINAL; BEGIN IF n = 0 THEN RETURN 0 ELSIF n = 1 THEN RETURN 1 ELSE fnm 2 : = 0; fnm 1 : = 1; FOR i : = 2 TO n DO fn : = fnm 1 + fnm 2; fnm 2 : = fnm 1; fnm 1 : = fn END; (* FOR *) RETURN fn END (* IF *) END Fib; J. Tiberghien
Recursive Algorithms Towers of Hanoi • The problem : Moving one tower with n rings from A to B using C • Step-up function : – Move the n-1 upper rings from A to C – Move one ring from A to B – Move the n-1 rings from C to B • Trivial solution : – Moving a tower with no rings J. Tiberghien
Recursive Algorithms Towers of Hanoi • Recursive procedure : PROCEDURE Move. Tower (Height: CARDINAL From, Towards, Using: CHAR); PROCEDURE Move. Disk. . . BEGIN IF Height > 0 THEN Move. Tower(Height-1, From, Using, Towards) Move. Disk(From, Towards); Move. Tower(Height-1, Using, Towards, From) END (* IF *) END Move. Tower; J. Tiberghien
Recursive Algorithms Conclusion Simultaneous Simple Complex activations Algorithm Few Many . . . YES Never ? ? ? J. Tiberghien
Backtracking Algorithms A treelike maze J. Tiberghien
Generic Search with Backtracking No Select a successor node Allowed node ? Record selected node Final node ? Not yet Call recursively the backtracking procedure for the next node Yes Display the solution Erase previous node selection UNTIL all successor nodes have been explored J. Tiberghien
The Eight Queens Problem J. Tiberghien
Eight Queens Procedure PROCEDURE Try (Row : CARDINAL); FOR Col : = 1 TO 8 DO No Board[Row, Col] safe ? Yes Put queen on Board[Row, Col] (Row = 8) ? Not yet Try(Row+1) Yes Display the Board Remove queen from Board[Row, Col] J. Tiberghien
Eight Queens - Try PROCEDURE Try(Row : INTEGER); VAR Col : INTEGER; PROCEDURE Safe … … … ; BEGIN FOR Col : = 1 TO 8 DO IF Safe(Col, Row) THEN Board[Col, Row] : = FALSE; IF Row < 8 THEN Try(Row + 1) ELSE Print. Solution END; Board[Col, Row] : = TRUE END (* IF *) END (* FOR *) END Try; J. Tiberghien
Eight Queens - Board Extended board for determination of safe positions J. Tiberghien
Eight Queens - Safe PROCEDURE Safe(Col, Row : INTEGER): BOOLEAN; VAR r : INTEGER; f : BOOLEAN; BEGIN f : = TRUE; FOR r : = 1 TO Row-1 DO f : = f AND Board[Col, r] AND Board[Col+Row-r, r] AND Board[Col-Row+r, r] END; (* FOR *) RETURN f END Safe; J. Tiberghien
Eight Queens - Main program BEGIN FOR Col : = -6 TO 15 DO FOR Row : = 1 TO 8 DO Board[Col, Row] : = TRUE END; (* FOR Rows*) END; (* FOR Cols*) Try(1) END Queens. J. Tiberghien
Eight Queens - Non recursive FOR Col 1 : = 1 TO 8 DO IF Safe(Col 1, 1) THEN Board[Col 1, 1] : = FALSE; FOR Col 2 : = 1 TO 8 DO IF Safe(Col 2, 2) THEN Board[Col 2, 2] : = FALSE; . . . FOR Col 8 : = 1 TO 8 DO IF Safe(Col 8, 8) THEN Board[Col 8, 8] : = FALSE; Print. Solution Board[Col 8, 8] : = TRUE; END; (* FOR 8 *). . . Board[Col 2, 2] : = TRUE END; (* IF 2 *) END; (* FOR 2 *) Board[Col 1, 1] : = TRUE END; (* IF 1 *) END; (* FOR 1 *) J. Tiberghien
Frequency Synthetizer F=? SCM = 175 855 554 875 . /. n 6 2075 Hz . /. n 5 1925 Hz . /. n 4 1625 Hz . /. n 3 1475 Hz . /. n 2 1025 Hz . /. n 1 875 Hz J. Tiberghien
Frequency synthetizer Procedure PROCEDURE Try(Fr : CARDINAL); FOR Fact[Fr] : = Min. Fact[Fr] TO Max. Fact[Fr] DO No Acceptable factor ? Yes Update frequency range for oscillator Not yet Try(Fr+1) (Fr = 6) ? Yes Print Factors Restore previous frequency range J. Tiberghien
Traveling Salesman with Bactracking No Select next town Total distance < Min ? Yes Record next town Final town ? Not yet Call recursively the backtracking procedure for the next town Yes Min : = Total distance Erase previous town UNTIL all possible next towns have been selected J. Tiberghien
Recursive Fractals (1) Graphical libraries: FROM Graph IMPORT Init, Plot, Rectangle, _WHITE, _BLUE, _clr. LIGHTRED, _clr. WHITE; Basic building block: a rectangle PROCEDURE Rectangle(xl, yl, xr, yh, color) yh xl xr yl J. Tiberghien
Recursive Fractals(2) To draw a square of size 2 d centered in x, y: PROCEDURE Box(x, y, d: CARDINAL, color); BEGIN Rectangle(x-d, y-d, x+d, y+d, color) END Box; d d x, y J. Tiberghien
Recursive Fractals(3) To draw an elementary fractal box : Rectangle(x-d, y-d, x+d, y+d); Box(x-d, y-d, d DIV 2); Box(x-d, y+d, d DIV 2); Box(x+d, y-d, d DIV 2); Box(x+d, y+d, d DIV 2); J. Tiberghien
Recursive Fractals(4) To draw a series of n fractal boxes : PROCEDURE Fractal. Box(x, y, d, n: CARDINAL); BEGIN Rectangle(x-d, y-d, x+d, y+d); n : = n-1 IF n > 0 THEN Fractal. Box(x-d, y-d, d DIV 2, n); Fractal. Box(x-d, y+d, d DIV 2, n); Fractal. Box(x+d, y-d, d DIV 2, n); Fractal. Box(x+d, y+d, d DIV 2, n); END Fractal. Box J. Tiberghien
J. Tiberghien
- Slides: 25