Recursion

Report 6 Downloads 165 Views
Recursion P. P. Chakrabarti

1

30-01-03

P.P.Chakrabarti, IIT Kharagpur

%u format to see addresses [ppchak]$ ./a.out 1: x = 10, &x = 3221224548 2: y = 5, &y = 3221224544 1: p = a, &p = 3221224543 2: q = b, &q = 3221224542 4: m = 10.40, &y = 3221224536 4: n = -11.30, &n = 3221224532

main() { int x=10, y=5; char p = 'a', q = 'b'; float m = 10.4, n= -11.3; printf ("1: x = %d, &x = %u\n", x, &x); printf ("2: y = %d, &y = %u\n", y, &y); printf ("1: p = %c, &p = %u\n", p, &p); printf ("2: q = %c, &q = %u\n", q, &q); printf ("4: m = %.2f, &y = %u\n", m, &m); printf ("4: n = %.2f, &n = %u\n", n, &n); }

2

30-01-03

P.P.Chakrabarti, IIT Kharagpur

factorial function main() { int x,y; scanf(“%d”,&x); y = fact(x); printf (“M: x = %d, y = %d\n”, x,y); }

Factorial computation: fact(n) = 1 if n 1) val = data*fact(data-1); return val; }

3

30-01-03

P.P.Chakrabarti, IIT Kharagpur

factorial function main() { int x,y; scanf(“%d”,&x); y = fact(x); printf (“M: x = %d, y = %d\n”, x,y); } int fact (int data) { int val=1; if (data >1) val = data*fact(data-1); return val; }

Factorial computation: fact(n) = 1 if n 1) val = data*fact(data-1); printf(“Exit: data = %d, val = %d\n”, data, val); return val; }

6

30-01-03

[ppchak]$ ./a.out 1 Enter: data = 1, val = 1 Exit: data = 1, val = 1 M: x= 1, y = 1 [ppchak]$ ./a.out 2 Enter: data = 2, val = 1 Enter: data = 1, val = 1 Exit: data = 1, val = 1 Exit: data = 2, val = 2 M: x= 2, y = 2

P.P.Chakrabarti, IIT Kharagpur

More runs for Factorial function main() { int x,y; scanf(“%d”,&x); y = fact(x); printf (“M: x %d, y = %d\n”, x,y); } int fact (int data) { int val=1; printf(“Enter: data = %d, val = %d\n”, data, val); if (data>1) val = data*fact(data-1); printf(“Exit: data = %d, val = %d\n”, data, val); return val; }

7

30-01-03

[ppchak]$ ./a.out 4 Enter: data = 4, val = 1 Enter: data = 3, val = 1 Enter: data = 2, val = 1 Enter: data = 1, val = 1 Exit: data = 1, val = 1 Exit: data = 2, val = 2 Exit: data = 3, val = 6 Exit: data = 4, val = 24 M: x= 4, y = 24

P.P.Chakrabarti, IIT Kharagpur

Look at the variable addresses! main() { int x,y; scanf("%d",&x); y = fact(x); printf ("M: x= %d, y = %d\n", x,y); }

[ppchak]$ ./a.out 4 F: data = 4, &data = 3221224528 &val = 3221224516 F: data = 3, &data = 3221224480 &val = 3221224468 F: data = 2, &data = 3221224432

int fact(int data) { int val=1; printf("F: data = %d, &data = %u \n &val = %u\n", data, &data, &val); if (data>1) val = data*fact(data-1); return val; }

8

30-01-03

&val = 3221224420 F: data = 1, &data = 3221224384 &val = 3221224372 M: x= 4, y = 24

P.P.Chakrabarti, IIT Kharagpur

Another recursive function: my_read() { char data; scanf("%c", &data); printf("Before: Data = %c\n", data); if (data !='x') my_read(); printf("After: Data = %c\n", data); } main() { my_read(); }

9

30-01-03

P.P.Chakrabarti, IIT Kharagpur

Run for Read-Print-Reverse: my_read() { char data; scanf("%c", &data); printf("Before: Data = %c\n", data); if (data !='x') my_read(); printf("After: Data = %c\n", data); }

[ppchak]$ ./a.out maxim Before: Data = m Before: Data = a Before: Data = x After: Data = x After: Data = a

main() { my_read(); }

10

After: Data = m

30-01-03

P.P.Chakrabarti, IIT Kharagpur

Fibonacci Numbers Fibonacci recurrence: fib(n) = 1 if n =0 or 1; = fib(n – 2) + fib(n – 1) otherwise;

int fib (int n) { if (n==0 or n==1) return 1; [BASE] return fib(n-2) + fib(n-1) ; [Recursive] } 11

30-01-03

P.P.Chakrabarti, IIT Kharagpur

int fib (int n) { if (n==0 || n==1) return 1; return fib(n-2) + fib(n-1) ; }

Fibonacci recurrence: fib(n) = 1 if n =0 or 1; = fib(n – 2) + fib(n – 1) otherwise;

fib (5) fib (3) fib (1) fib (0)

fib (4)

fib (2) fib (1)

fib (2) fib (0)

fib (3)

fib (1) fib (1)

fib (2)

fib (0)

12

30-01-03

fib (1)

P.P.Chakrabarti, IIT Kharagpur

int fib (int n) { if (n==0 || n==1) return 1; return fib(n-2) + fib(n-1) ; }

Fibonacci recurrence: fib(n) = 1 if n =0 or 1; = fib(n – 2) + fib(n – 1) otherwise;

fib (5) fib (3) fib (1) 1

fib (2)

fib (0) 1

13

fib (4)

fib (1) 1

fib (2) fib (0) 1

fib (3)

fib (1) fib (1) 1 1

30-01-03

fib (2)

fib (0)

fib (1)

1

1

P.P.Chakrabarti, IIT Kharagpur

int fib (int n) { if (n==0 || n==1) return 1; return fib(n-2) + fib(n-1) ; }

Fibonacci recurrence: fib(n) = 1 if n =0 or 1; = fib(n – 2) + fib(n – 1) otherwise;

8 fib (5) 3

5 fib (4)

fib (3) 1 fib (1) 1 1 fib (0) 1

14

2

2 fib (2)

fib (2) 1 fib (1) 1

1 fib (0) 1

3 fib (3) 2

1 1 fib (1) fib (1) 1 1

30-01-03

fib (2) 1

1 fib (0)

fib (1)

1

1

P.P.Chakrabarti, IIT Kharagpur

int sumSquares (int m, int n) { int middle ; if (m==n) return m*m; else { middle = (m+n)/2; return sumSquares(m,middle) + sumSquares(middle+1,n); }

Another example

sumSquares(5,10)

sumSquares(8,10) sumSquares(5,10)

sumSquares(5,7)

sumSquares(5,6)

sumSquares(7,7)

sumSquares(8,9)

sumSquares(10,10)

sumSquares(9,9) sumSquares(5,5)

15

sumSquares(6,6)

sumSquares(8,8) 30-01-03

P.P.Chakrabarti, IIT Kharagpur

Annotated Call Tree 355 sumSquares(5,10) 245 sumSquares(8,10) sumSquares(5,10)

110 sumSquares(5,7) 49

61 sumSquares(5,6)

sumSquares(7,7)

36

25 sumSquares(5,5)

1625

sumSquares(8,9)

49

sumSquares(8,8)

64 30-01-03

sumSquares(10,10)

81

64

sumSquares(6,6)

36

100

145

sumSquares(9,9)

81

100 P.P.Chakrabarti, IIT Kharagpur

Trace sumSq(5,10) = (sumSq(5,7) + sumSq(8,10)) = (sumSq(5,6) + (sumSq(7,7)) + (sumSq(8,9) + sumSq(10,10)) = ((sumSq(5,5) + sumSq(6,6)) + sumSq(7,7)) + ((sumSq(8,8) + sumSq(9,9)) + sumSq(10,10)) = ((25 + 36) + 49) + ((64 + 81) + 100) = (61 + 49) + (145 + 100) = (110 + 245) = 355

17

30-01-03

P.P.Chakrabarti, IIT Kharagpur

Tower of Hanoi

A

18

B

C

30-01-03

P.P.Chakrabarti, IIT Kharagpur

Tower of Hanoi

A

19

B

C

30-01-03

P.P.Chakrabarti, IIT Kharagpur

Tower of Hanoi

A

20

B

C

30-01-03

P.P.Chakrabarti, IIT Kharagpur

Tower of Hanoi

A

21

B

C

30-01-03

P.P.Chakrabarti, IIT Kharagpur