Tom Kelliher, CS18
Feb. 28, 1996
Things to notice:
Similarities to homework program?
int BinSearch(const int A[], int First, int Last, int Value) { if (First > Last) return -1; // Value not in original array else { // Invariant: If Value is in A, // A[First] <= Value <= A[Last] int Mid = (First + Last)/2; if (Value == A[Mid]) return Mid; // Value found at A[Mid] else if (Value < A[Mid]) return BinSearch(A, First, Mid-1, Value); // X else return BinSearch(A, Mid+1, Last, Value); // Y } // end else } // end BinSearch
Costs:
Consider:
int fib(int val) { if (val <= 2) return 1; else return fib(val - 1) + fib(val - 2); }
Call graph for fib(6):
A function is tail recursive if the very last thing it does is make its recursive call.
Example:
void printLinkedList(list* l) { if (l != NULL) { cout << l->fname << " " << l->lname << endl; printLinkedList(l->next); } }
Recall:
int fact(int n) { if (n <= 1) return 1; else return n * fact(n - 1); }
Are fact(), fib() tail recursive?
What is it?
Write a recursive function which prints a reversed string
void reverse(char* s) { if (*s != '\0') { reverse(s + 1); cout << *s; } }
Is it head recursive?
Utility of head recursion
Write a recursive function which computes pow(n, i).
int pow(int n, int i) { if (i == 0) return 1; else if (i == 1) return n; else { int partial = pow(n, i / 2); if (i % 2 == 0) return partial * partial; else return partial * partial * n; } }
More efficient than iterative solution?
To work on the homework program