10/18/2015assoc. prof. stoyan bonev1 cos220 concepts of pls aubg, cos dept exercise 08a iteration...

27
03/23/22 assoc. prof. Stoyan Bonev 1 COS220 Concepts of PLs AUBG, COS dept Exercise 08a Iteration and Recursion in Procedure Oriented Programming Reference: lecture 08

Upload: anthony-carter

Post on 01-Jan-2016

218 views

Category:

Documents


1 download

TRANSCRIPT

04/20/23 assoc. prof. Stoyan Bonev 1

COS220 Concepts of PLs AUBG, COS dept

Exercise 08a

Iteration and Recursion in Procedure Oriented

Programming

Reference: lecture 08

04/20/23 assoc. prof. Stoyan Bonev 2

Exercise Topics:

• Build and test a set of functions that illustrate the implementation of certain iterative and recursive algorithms.

04/20/23 assoc. prof. Stoyan Bonev 3

Task 1Build and test a set of iterative and recursive functions to calculate:

Function description Function prototype (signature)

  Iteration Recursion

Factorial int facti(int n); int factr(int n);

Greatest common divisor int gcdi(int m, int n); int gcdr(int m, int n);

Sum of natural numbers 0,1,2,3, … int sumi(int n); int sumr(int n);

Sum of elements of 1dimensioned array

int sumi(int ar[], int n); int sumr(int ar[], int n);

To calculate element of Fibonacci series int fibi(int n); int fibr(int n);

To calculate square root; yn+1=1/2(x/yn+yn)

y0=1sqrtr(x,yn,eps) = yn, |yn

2-x|<eps, else

= sqrtr(x, (yn2+x)/2yn, eps)

Ackermann function   int Ar(int m, int n);

Hanoi towers game    

04/20/23 assoc. prof. Stoyan Bonev 4

Task 2

Describe the algorithm that the following function performs:

void printd(int n) {

if (n<0) { putchar(‘-‘); n=-n; }

if (n/10) printd(n/10);putchar(n%10 + ‘0’);

}

04/20/23 assoc. prof. Stoyan Bonev 5

Task 4

Build and test a recursive function to return the product on two integer values. Hint: Use definition of multiplication as a function in terms of a conditional expression:

m * n ≡ mulr(m,n) = [ (n==0)->0, (n==1)->m, m + mulr(m, n-1) ]

Try to formulate and solve similar tasks for addition, subtraction and division operators.

04/20/23 assoc. prof. Stoyan Bonev 6

• Task 5. Build a program with iterative and recursive functions to illustrate the linear search algorithm and the binary search algorithm (RecursiveLinBinSearch.cpp):

See the next page

04/20/23 assoc. prof. Stoyan Bonev 7

Linear search algorithm1. Assume the target has not been

found.2. Start with the initial array element.3. Repeat while the target is not found

and there are more array elements{

4. If the current element matches the target

5. Set flag to indicate the target was found

Else 6. Advance to the next array

element} // end of repeat

7. If the target was found8. Return the target index as a search

result Else

9. Return –1 as a search result. 

Binary search algorithm1. Assume array sorted and target not

found2. Let low be subscript of initial array

element.3. Let high be subscript of the last array

element.4. Repeat as long as high>low (low<=high)

and the target has not been found{

5. Let mid be subscript of the element halfway between low and high 6. If element at mid is the target

7. Return mid (the target index) as search result

Else 8. If the element at mid is > the target

9. Let high be mid – 1 Else

10. Let low be mid + 1} // end of repeat

11. return –1 as a search result.

04/20/23 assoc. prof. Stoyan Bonev 8

Iterative Linear Search

int LinSearchIterative(int target, int tab[], int size) { int k = 0; while ( k < size ) { if (target == tab[k]) return k; k++; } return -1; }

Recursive Linear search

int LinSearchRecursive(int target,int tab[], int low, int high) {

if (high < low) return -1; if (target == tab[high]) return high; return LinSearchRecursive(target, tab, low, high-1);}

04/20/23 assoc. prof. Stoyan Bonev 9

Iterative Binary search

int BinSearchIterative(int target, int table[], int size) { int low, high, mid; low = 0; high = size - 1; while ( low <= high ) { mid = (low + high) / 2; if (target == table[mid]) return mid; if (target < table[mid]) high = mid - 1; if (target > table[mid]) low = mid + 1; } return -1; }

Recursive Binary search

int BinSearchRecursive(int target, int table[], int low, int high) { if (low > high) return -1; int mid; mid = (low + high) / 2; if (target == table[mid]) return mid; if (target < table[mid]) // low half of the table, high = mid -1; { return BinSearchRecursive(target, table, low, mid-1); } if (target > table[mid]) // high half of the table, low = mid+1; { return BinSearchRecursive(target, table, mid+1, high); }}

04/20/23 assoc. prof. Stoyan Bonev 10

More info on Recursion

Recursive Helper Methods

04/20/23 assoc. prof. Stoyan Bonev 11

More info on Recursion

Sometimes you can find a recursive solution by slightly changing the original problem.

The new method is called recursive helper method.

Example: the palindrom problem:isPali(), isPalr(), isPalrHelper()

04/20/23 assoc. prof. Stoyan Bonev 12

The iterative isPali()

bool isPali(string p) { int i=0, j = p.length()-1; //for(int i=0, int j=p.length()-1; i<j; i++, j--) while(i<j) { if(p.at(i) != p.at(j) ) return false; i++; j--; } return true; } // end of isPali

04/20/23 assoc. prof. Stoyan Bonev 13

The recursive isPalr()

bool isPalr(string p) { if (p.length() <= 1) return true; if(p.at(0) != p.at(p.length()-1) ) return

false; return isPalr(p.substr(1,p.length()-2)); } // end of isPalr

04/20/23 assoc. prof. Stoyan Bonev 14

Comments on isPalr()

The recursive isPalr() is not efficient because it creates a new substring for every recursive call.

To avoid creating new strings, you can use the low and high indices to indicate the range of the substring.

These two indices must be passed to recursive method.

Original method isPalr(string s) has to be overloaded to isPalr(string s, int low, int high)

04/20/23 assoc. prof. Stoyan Bonev 15

The recursive helper method

bool isPalrHelper(string p) { return isPalrHelper(p, 0, p.length()-1 ); }bool isPalrHelper(string p, int low, int high )

{ if (low >= high) return true; // Base case if (p.at(low) != p.at(high) ) return false; return isPalrHelper(p, low+1, high-1); } // end of isPalrHelper

04/20/23 assoc. prof. Stoyan Bonev 16

The main() functionvoid main() { string pom; cout << "Type a string to test as palindrome:"; cin >> pom; while ( !cin.eof()) { cout << "\nThe string that You just typed: " << pom; if (isPali(pom) && isPalr(pom) && isPalrHelper(pom)) cout << " is palindrome"; else cout << " is not palindrome"; cout << "\nType another string to test as

palindrome:";cin >> pom;

} } // end of Main

04/20/23 assoc. prof. Stoyan Bonev 17

More info on Recursion

Tail Recursion

04/20/23 assoc. prof. Stoyan Bonev 18

More info on Recursion

A tail recursive method is efficient for reducing stack size.

A recursive method is said to be tail recursive if there are no pending operations to be performed on return from a recursive call.

recMethodA() { recMethodB() {… …… recMethodB();recMethodA(); …} }

04/20/23 assoc. prof. Stoyan Bonev 19

More info on Recursion

Examplec:

GCDr() is tail-recursive method

Factr() is nontail-recursive method

04/20/23 assoc. prof. Stoyan Bonev 20

More info on Recursion

Tail recursion is desirable because the method ends when the last recursive call ends.

There is no need to store intermediate calls in the stack.

04/20/23 assoc. prof. Stoyan Bonev 21

More info on Recursion

A nontail-recursive method can often be converted to tail-recursive method by using auxiliary parameters.

These parameters are used to contain result.

04/20/23 assoc. prof. Stoyan Bonev 22

nontail-recursive method factr

int factr(int n) { if (n==0) return 1; return n*factr(n-1); }

04/20/23 assoc. prof. Stoyan Bonev 23

tail-recursive method factr

int factrTailRec(int n) { return factrTailRec(n, 1); } int factrTailRec(int n, int result) { if (n==0) return result; else return factrTailRec(n-1, n*result); }

04/20/23 assoc. prof. Stoyan Bonev 24

The main() method

void main() { // DEMO on Tail Recursion with // helper methods in recursion cout << "Factorial classic recursion & tail recursion"; for (int i=0; i<=10; i++) { cout<<endl<<i<<" "<<factr(i)<<"

"<<factrTailRec(i); }}

04/20/23 assoc. prof. Stoyan Bonev 25

More info on Recursion

Indirect Recursion

Nested Recursion

Excessive Recursion

04/20/23 assoc. prof. Stoyan Bonev 26

.

Quiz #2On

Functions, Iteration and Recursion planned for end of the class

04/20/23 assoc. prof. Stoyan Bonev 27

Thank YouFor

Your Attention