Exercise 4 Recursion Functions a short reminder n

  • Slides: 81
Download presentation
Exercise 4 Recursion

Exercise 4 Recursion

Functions – a short reminder n n a group of variables and statements that

Functions – a short reminder n n a group of variables and statements that is assigned a name a sub-program ¡ ¡ inside main we can call other functions These functions can call other functions.

Another way of looking at factorial n As we saw, n! = 1*2*3*… *(n-1)*n

Another way of looking at factorial n As we saw, n! = 1*2*3*… *(n-1)*n (n-1)! n *n Thus, we can also define factorial the following way: ¡ ¡ 0! = 1 n! = n*(n-1)! for n>0

A recursive definition n C functions can also call themselves! ¡ n n n

A recursive definition n C functions can also call themselves! ¡ n n n However, usually not with the same parameters (why? ) Some functions can be defined using smaller occurrences of themselves. Such a definition is called a “recursive definition” of a function. Every recursive function has a “boundary condition”. The function stops calling itself when it is satisfied. ¡ Why is this necessary?

Example - factorial int factorial(int n) { int fact = 1; while (n >=

Example - factorial int factorial(int n) { int fact = 1; while (n >= 1) { fact *=n; n--; } return fact; } int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); }

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); } Fact. Rec(4) n 4 Returns…

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); } Fact. Rec(4) n 4 Returns… 4*…

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); } Fact. Rec(4) Fact. Rec(3) n 4 n 3 Returns…

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); } Fact. Rec(4) Fact. Rec(3) n 4 n 3 Returns…

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; Fact. Rec(4) Fact. Rec(3) n 4 n 3 Returns… 3*… return n*fact. Rec(n-1); }

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; Fact. Rec(4) Fact. Rec(3) n n 4 Fact. Rec(2) 3 n Returns… 2 Returns… return n*fact. Rec(n-1); }

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; Fact. Rec(4) Fact. Rec(3) n n 4 Fact. Rec(2) 3 n Returns… 2 Returns… return n*fact. Rec(n-1); }

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; Fact. Rec(4) Fact. Rec(3) n n 4 Fact. Rec(2) 3 n Returns… 2 Returns… return n*fact. Rec(n-1); } 2*…

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); } Fact. Rec(4) Fact. Rec(3) n n 4 Fact. Rec(2) 3 Fact. Rec(1) n Returns… 2 n Returns… 1 Returns…

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); } Fact. Rec(4) Fact. Rec(3) n n 4 Fact. Rec(2) 3 Fact. Rec(1) n Returns… 2 n Returns… 1 Returns…

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); } Fact. Rec(4) Fact. Rec(3) n n 4 Fact. Rec(2) 3 Fact. Rec(1) n Returns… 2 n Returns… 1

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; Fact. Rec(4) Fact. Rec(3) n n 4 Fact. Rec(2) 3 n Returns… 2 Returns… return n*fact. Rec(n-1); } 2*1

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; Fact. Rec(4) Fact. Rec(3) n 4 n 3 Returns… 3*2 return n*fact. Rec(n-1); }

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 ||

Recursive factorial – step by step int fact. Rec(int n) { if (n==0 || n==1) return 1; return n*fact. Rec(n-1); } Fact. Rec(4) n 4 Returns… 4*6

Another example - power n y X = x*x*…*x y times n Recursive definitions

Another example - power n y X = x*x*…*x y times n Recursive definitions (assume nonnegative y): ¡ 1. 2. Base: x 0=1 y y-1 X = X*(X ) y y/2 2 X = (X ) (for even y’s only)

Example rec_pow. c

Example rec_pow. c

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x 2 Returns… y 5

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x 2 Returns… y 5

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x 2 Returns… y 5

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x 2 Returns… y 5

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x 2 Returns… 2*… y 5

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 x 5 y 2 Returns… 4

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 x 5 y 2 Returns… 4

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 x 5 y 2 Returns… 4

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 x 5 y 2 Returns… 4 Returns… square(…)

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 x Returns… 2 Returns… 4 y 2 square(…) Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 x Returns… 2 Returns… 4 y 2 square(…) Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 x Returns… 2 Returns… 4 y 2 square(…) Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 x Returns… 2 Returns… 4 y 2 square(…) Returns… square(…)

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 x Returns… 2 y square(…) 2 1 Returns… square(…) Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 x Returns… 2 y square(…) 2 1 Returns… square(…) Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 x Returns… 2 y square(…) 2 1 Returns… square(…) Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 x Returns… 2 y square(…) 2 1 Returns… square(…) Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 x Returns… 2 y square(…) 2 1 Returns… square(…) Returns… 2*…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 y Returns… rec_pow(2, 0) square(…) 2 x 1 y Returns… square(…) 2 0 Returns… 2*… Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 y Returns… rec_pow(2, 0) square(…) 2 x 1 y Returns… square(…) 2 0 Returns… 2*… Returns…

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 y Returns… rec_pow(2, 0) square(…) 2 x 1 y Returns… square(…) 2 0 Returns… 2*… Returns… 1

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 rec_pow(2, 4 y 1) Returns… x 2 x Returns… 2 y square(…) 2 1 Returns… square(…) Returns… 2*1

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 rec_pow(2, 5 y 2) x 2 x Returns… 2 Returns… 4 y 2 square(…) Returns… square(2)

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x y 4) rec_pow(2, 2 x 5 y 2 Returns… 4 Returns… square(4)

rec_pow – step by step int rec_pow(int x, int y) { if (y ==

rec_pow – step by step int rec_pow(int x, int y) { if (y == 0) return 1; if (y%2 == 0) return square(rec_pow(x, y/2)); else return x*rec_pow(x, y-1); } rec_pow(2, 5) x 2 Returns… 2*16 y 5

Exercise n Write a program that receives two nonnegative integers and computes their product

Exercise n Write a program that receives two nonnegative integers and computes their product recursively. n Hint: Notice that the product a*b is actually a+a+…+a (b times).

Solution n rec_mul. c

Solution n rec_mul. c

Exercise n Given the following iterative version of sum -of-digits calculation Find the recursive

Exercise n Given the following iterative version of sum -of-digits calculation Find the recursive definition of this function (don’t forget the base case!) int sum_digits(int n) { int sum = 0; while (n > 0) { sum += n%10; n = n/10; } return sum; }

Solution n sum_digit_rec. c

Solution n sum_digit_rec. c

More uses n n n Recursion is a general approach to programming functions Its

More uses n n n Recursion is a general approach to programming functions Its uses are not confined to calculating mathematical expressions! For example – max_rec. c

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) arr size rest 752 4 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) arr size rest 752 4 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) arr size rest 752 4 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) arr size rest 752 4 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) arr 752 4 size …rest 756 3 Returns… … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) arr 752 4 size …rest 756 3 Returns… … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) arr 752 4 size …rest 756 3 Returns… … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) arr 752 4 size …rest 756 3 Returns… … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) 756 arr 3 size …rest Returns… 760 2 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) 756 arr 3 size …rest Returns… 760 2 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) 756 arr 3 size …rest Returns… 760 2 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) 756 arr 3 size …rest Returns… 760 2 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) rec_max(764, 756 arr 3 size …rest 1) Returns… 760 arr 2 size …rest Returns… 764 1 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) rec_max(764, 756 arr 3 size …rest 1) Returns… 760 arr 2 size …rest Returns… 764 1 … Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) rec_max(764, 756 arr 3 size …rest 1) Returns… 760 arr 2 size …rest Returns… 764 1 … Returns… 3 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) 756 arr 3 size …rest Returns… 760 2 3 Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) 756 arr 3 size …rest Returns… 760 2 3 Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) rec_max(760, arr 752 4 size …rest 2) 756 arr 3 size …rest Returns… 760 2 3 Returns… 5 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) arr 752 4 size …rest 756 3 Returns… 5 Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) arr 752 4 size …rest 756 3 Returns… 5 Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) arr 752 4 size …rest 756 3 Returns… 5 Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) rec_max(756, arr size rest 3) arr 752 4 size …rest 756 3 Returns… 5 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) arr size rest 752 4 5 Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) arr size rest 752 4 5 Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) arr size rest 752 4 5 Returns… 1 752 4 5 3 756 760 764

max_rec – step by step int rec_max(int arr[ ], int size) { int rest;

max_rec – step by step int rec_max(int arr[ ], int size) { int rest; if (size == 1) return arr[0]; else { rest = rec_max(arr+1, size-1); if (arr[0] > rest) return arr[0]; else return rest; } } rec_max(752, 4) arr size rest 752 4 5 Returns… 5 1 752 4 5 3 756 760 764

Riddle: what does this do? char *rec_func(char str[], char c) { if (*str ==

Riddle: what does this do? char *rec_func(char str[], char c) { if (*str == '') return NULL; if (*str == c) return str; return rec_func(str+1, c); }

Solution n n A recursive implementation of strchr See strchr_rec. c

Solution n n A recursive implementation of strchr See strchr_rec. c

Exercise n Write a recursive implementation of strcmp – ¡ ¡ n Input –

Exercise n Write a recursive implementation of strcmp – ¡ ¡ n Input – two strings Output – 0 if both are equal, 1 if not Write a program that accepts two strings from the user and checks whether they are equal

Solution n strcmp_rec. c

Solution n strcmp_rec. c