Presentation is loading. Please wait.

Presentation is loading. Please wait.

Recursion Department of Computer Science-BGU יום שני 10 דצמבר 2018.

Similar presentations


Presentation on theme: "Recursion Department of Computer Science-BGU יום שני 10 דצמבר 2018."— Presentation transcript:

1 Recursion Department of Computer Science-BGU יום שני 10 דצמבר 2018

2 Functions – reminder A function can call other functions.
return-type name(argType1 arg1, argType2 arg2, …) { function body; return value; } A function can call other functions. Return causes the execution of the function to terminate and returns a value to the calling function. The type of the value returned must be the same as the return-type defined for the function. Department of Computer Science-BGU יום שני 10 דצמבר 2018

3 A recursive definition
C functions can also call themselves! 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. Department of Computer Science-BGU יום שני 10 דצמבר 2018

4 Recursive calling Infinite series of * What is the problem ?
Example: void func(int n){ putchar(`*`); func(n); } Infinite series of * What is the problem ? Look for other problem … Department of Computer Science-BGU יום שני 10 דצמבר 2018

5 Factorial By definition :
n! = 1*2*3*… *(n-1)*n Thus, we can also define factorial the following way: 0! = 1 n! = n*(n-1)! for n>0 (n-1)! *n Department of Computer Science-BGU יום שני 10 דצמבר 2018

6 Example - factorial int factorial(int n){ int fact = 1; while (n >= 1) { fact *=n; n--; } return fact; int factRec(int n){ if (n==0 || n==1) return 1; return n*factRec(n-1); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

7 Conclusions for Recursive calling
Every recursive function has a “boundary condition”. The function stops calling itself when it is satisfied. Department of Computer Science-BGU יום שני 10 דצמבר 2018

8 Recursive factorial – step by step
FactRec(4) int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } n 4 Returns… Department of Computer Science-BGU יום שני 10 דצמבר 2018

9 Recursive factorial – step by step
FactRec(4) int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } n 4 Returns… 4*… Department of Computer Science-BGU יום שני 10 דצמבר 2018

10 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… Department of Computer Science-BGU יום שני 10 דצמבר 2018

11 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… Department of Computer Science-BGU יום שני 10 דצמבר 2018

12 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… 3*… Department of Computer Science-BGU יום שני 10 דצמבר 2018

13 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… Department of Computer Science-BGU יום שני 10 דצמבר 2018

14 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… Department of Computer Science-BGU יום שני 10 דצמבר 2018

15 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… 2*… Department of Computer Science-BGU יום שני 10 דצמבר 2018

16 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… FactRec(1) n 1 Returns… Department of Computer Science-BGU יום שני 10 דצמבר 2018

17 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… FactRec(1) n 1 Returns… Department of Computer Science-BGU יום שני 10 דצמבר 2018

18 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… FactRec(1) n 1 Returns… Department of Computer Science-BGU יום שני 10 דצמבר 2018

19 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… 2*1 Department of Computer Science-BGU יום שני 10 דצמבר 2018

20 Recursive factorial – step by step
FactRec(4) n 4 Returns… int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(3) n 3 Returns… 3*2 Department of Computer Science-BGU יום שני 10 דצמבר 2018

21 Recursive factorial – step by step
FactRec(4) n 4 Returns… 4*6 int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

22 הדפסת מספרים- דוגמא 1 #include <stdio.h> void print1(int n){ if (n>=0){ printf("%d ",n); print1(n-1); { void main(){ int i = 3; print1(i); putchar('\n'); 3 2 1 Department of Computer Science-BGU יום שני 10 דצמבר 2018

23 הדפסת מספרים- דוגמא 2 #include <stdio.h> void print2(int n){ if (n>=0){ print2(n-1); printf("%d ",n); { void main(){ int i = 3; print2(i); putchar('\n'); 1 2 3 Department of Computer Science-BGU יום שני 10 דצמבר 2018

24 הדפסת מספרים- דוגמא 3 #include <stdio.h> void print3(int n){ if (n>=0){ printf("%d ",n); print3(n-1); { void main(){ int i = 3; print3(i); putchar('\n'); 3 2 1 1 2 3 Department of Computer Science-BGU יום שני 10 דצמבר 2018

25 הדפסת מספרים- דוגמא 4 #include <stdio.h> void print4(int n){ if (n>=0){ print4(n-1); printf("%d ",n); { void main(){ int i = 3; print4(i); putchar('\n'); 1 2 1 3 1 2 1 Department of Computer Science-BGU יום שני 10 דצמבר 2018

26 Fibonacci Series n0 = 0 n1 = 1 nn = nn-1 + nn-2
Fibonacci definition: n0 = 0 n1 = 1 nn = nn nn-2 Department of Computer Science-BGU יום שני 10 דצמבר 2018

27 Fibonacci Iterative void fibonacci(int n) { int Fn, Fn1, Fn2, ind;
if ( n == 1 ) Fn = 1 ; for (ind=2 ; ind <= n ; ind++){ Fn = Fn1 + Fn2; Fn2 = Fn1; Fn1 = Fn; } printf("F(%d) = %d \n", n, Fn); Department of Computer Science-BGU יום שני 10 דצמבר 2018

28 Fibonacci Recursive int fibonacci(int n) { if (n==0) return 0;
return fibonacci(n-1) + fibonacci(n-2); } fibonacci(1) fibonacci(5) fibonacci(4) fibonacci(3) fibonacci(2) fibonacci(0) Department of Computer Science-BGU יום שני 10 דצמבר 2018

29 Another example - power
Xy = x*x*…*x Recursive definitions (assume non-negative y): Base: x0=1 Xy = X*(Xy-1) Xy = (Xy/2)2 (for even y’s only) y times Department of Computer Science-BGU יום שני 10 דצמבר 2018

30 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

31 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

32 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

33 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

34 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… 2*… y 5 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); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

35 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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, 4) x 2 Returns… y 4 Department of Computer Science-BGU יום שני 10 דצמבר 2018

36 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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, 4) x 2 Returns… y 4 Department of Computer Science-BGU יום שני 10 דצמבר 2018

37 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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, 4) x 2 Returns… y 4 Department of Computer Science-BGU יום שני 10 דצמבר 2018

38 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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, 4) x 2 Returns… square(…) y 4 Department of Computer Science-BGU יום שני 10 דצמבר 2018

39 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) x 2 Returns… y Department of Computer Science-BGU יום שני 10 דצמבר 2018

40 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) x 2 Returns… y Department of Computer Science-BGU יום שני 10 דצמבר 2018

41 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) x 2 Returns… y Department of Computer Science-BGU יום שני 10 דצמבר 2018

42 rec_pow – step by step rec_pow(2, 5)
x 2 Returns… y 5 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, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) x y 2 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

43 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… y 1 x y 2 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

44 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… y 1 x y 2 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

45 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… y 1 x y 2 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

46 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… y 1 x y 2 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

47 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… 2*… y 1 x y 2 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

48 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… 2*… y 1 x y 2 rec_pow(2, 0) x 2 Returns… y 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

49 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… 2*… y 1 x y 2 rec_pow(2, 0) x 2 Returns… y 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

50 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… 2*… y 1 x y 2 rec_pow(2, 0) x 2 Returns… 1 y 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

51 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) rec_pow(2, 1) x 2 Returns… 2*1 y 1 x y 2 2 Returns… square(…) Department of Computer Science-BGU יום שני 10 דצמבר 2018

52 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(2, 4) x 2 Returns… square(…) y 4 rec_pow(2, 2) x y 2 2 Returns… square(2) Department of Computer Science-BGU יום שני 10 דצמבר 2018

53 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(2, 4) x 2 Returns… square(4) y 4 Department of Computer Science-BGU יום שני 10 דצמבר 2018

54 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 Department of Computer Science-BGU יום שני 10 דצמבר 2018

55 Exercise Write a program that receives two non-negative integers and computes their product recursively. Not * multiple operator !! Hint: Notice that the product a*b is actually a+a+…+a (b times). Department of Computer Science-BGU יום שני 10 דצמבר 2018

56 Solution int recMult( int x, int y ) { if( x == 0) return 0; return y + recMult( x-1,y); { Department of Computer Science-BGU יום שני 10 דצמבר 2018

57 Exercise 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; Department of Computer Science-BGU יום שני 10 דצמבר 2018

58 Solution int sumOfDigits( int x ) { if( x < 0) x *= -1; if( x == 0 ) return 0; else return x % 10 + sumOfDigits( x / 10 ); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

59 More uses Recursion is a general approach to programming functions.
Its uses are not confined to calculating mathematical expressions! For example : write a function that finds the max member in an array of integer. Department of Computer Science-BGU יום שני 10 דצמבר 2018

60 Solution 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) else return rest; } Department of Computer Science-BGU יום שני 10 דצמבר 2018

61 max_rec – step by step rec_max(752, 4)
rest 5 Returns… arr 752 size 4 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 rest; } 1 4 5 3 752 756 760 764 Department of Computer Science-BGU יום שני 10 דצמבר 2018

62 חיפוש בינארי int BinarySearch(int arr[],int x, int left, int right) { int middle; if(left>right) return -1; else { middle=(left+right)/2); if(arr[middle]==x) return middle; else if(x < arr[middle]) return BinarySearch(arr,x,left,middle-1); else return BinarySearch(arr,x,middle+1,right); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

63 שורש ריבועי – חיפוש בינארי
#define EPSILON double my_sqrt(double num, double left, double right) { double middle = (left + right) / 2; double temp= middle * middle; if(fabs(num - temp) < EPSILON) return middle; if(num > temp) return my_sqrt(num, middle, right); return my_sqrt(num ,left, middle); { Department of Computer Science-BGU יום שני 10 דצמבר 2018

64 Palindrome – Recursive
int RecPalindrome(char str[], int left, int right) { if(left >= right) return 1; if(str[left] != str[right]) return 0; return RecPalindrome(str, left + 1, right -1); { void main() { char s[256]; gets(s); if(RecPalindrome(s, 0, strlen(s) -1)) printf(“ %s is Palindrome\n", s); else printf(“ %s isn’t Palindrome\n", s); } Department of Computer Science-BGU יום שני 10 דצמבר 2018

65 Towers of Hanoi The Towers of Hanoi problem consists of three rods, and a number of disks of different sizes which can slide onto any rod. The puzzle starts with the disks in a neat stack in ascending order of size on one rod, the smallest at the top, thus making a conical shape. The objective of the puzzle is to move the entire stack to another rod, obeying the following rules: Only one disk may be moved at a time. Each move consists of taking the upper disk from one of the rods and sliding it onto another rod, on top of the other disks that may already be present on that rod. No disk may be placed on top of a smaller disk. Department of Computer Science-BGU יום שני 10 דצמבר 2018

66 Towers of Hanoi יום שני 10 דצמבר 2018
Department of Computer Science-BGU יום שני 10 דצמבר 2018

67 Recursive Solution To move n disks from peg A to peg C:
move n−1 disks from A to B. This leaves disk #n alone on peg A move disk #n from A to C move n−1 disks from B to C so they sit on disk #n Department of Computer Science-BGU יום שני 10 דצמבר 2018

68 Recursive Solution - Function
void hanoi(int x, char from, char to, char aux){  if(x==1){ printf("Move Disk From %c to %c\n", from, to); } else { hanoi(x-1,from,aux,to); hanoi(x-1,aux,to,from); Department of Computer Science-BGU יום שני 10 דצמבר 2018

69 Scope of variables - reminder
A variable declared within a function is unrelated to variables declared elsewhere. A function cannot access variables that are declared in other functions. Department of Computer Science-BGU יום שני 10 דצמבר 2018

70 3,A,B,C 2,C,B,A 2,A,C,B 1,B,C,A 1,A,B,C 1,A,B,C 1,C,A,B A->B
void hanoi(int x, char from, char to, char aux){  if(x==1){ printf("Move Disk From %c to %c\n", from, to); } else { hanoi(x-1,from,aux,to); hanoi(x-1,aux,to,from); A->B A->C B->C C->A C->B 3,A,B,C A->B 2,C,B,A 2,A,C,B A->C C->B 1,B,C,A 1,A,B,C 1,A,B,C 1,C,A,B A->B B->C C->A A->B Department of Computer Science-BGU יום שני 10 דצמבר 2018


Download ppt "Recursion Department of Computer Science-BGU יום שני 10 דצמבר 2018."

Similar presentations


Ads by Google