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