You are on page 1of 25

Lecture 12

Oct 15
Recursion more examples
Chapter 8 problems and solutions
Cell arrays, Chapter 10

Recursive functions
Before we conclude this chapter, we will discuss
recursive functions, those that can call themselves.
We have examples of functions that call other
functions, e.g. insertionsort calling insert etc.
If f(n) is defined in terms of f(n 1), as for example,
in the case of factorial, why not let f call itself?
n! = n x (n 1)!
Or in matlab:
fact(n) = n .* fact(n 1)

Rules for recursive functions


1. there should be exit from recursion. (i.e.,
there should be some conditional branch
path in which there is no recursive call). Such
cases are called the base cases.
2. recursive calls should make towards base
case (usually by calling itself with smaller
input values).
3. Recursion may be more time or memory
consuming so should be careful with their
use.

Example 1: Write a recursive function to compute n!


function out = fact(n)
if n <= 1 out = 1;
else out = n .* fact(n-1);
end;

Example 2: Write a recursive function in Matlab to


perform binary search.
Assume array A is sorted in ascending order.
Search(A, low, high, x) will return the largest t
such that A(t) <= x.
Pre-condition: A(low) <= x <= A(high)
Thus low <= t <= high.
Initially, low = 1, high = size(A)

Recursive binary search program


function out = search(A, low, high, x)
% returns the largest t s.t. A(t) <= x where
low <= t <= high
% A is assumed to be sorted
if high - low == 1
if A(high) == x
out = high;
else
out = low;
end;
else
mid = floor((low + high)/2);
if A(mid) == x out = mid;
elseif A(mid) < x
out = search(A, mid + 1, high, x);
else out = search(A, low, mid - 1, x);
end;
end;

Binary search program


function out = binary_search(A, x)
if A(1) < x out = 0;
else
out = search(A, 1, length(A), x)
end

Merge Sorting recursive algorithm


Write a program in Matlab to merge two
arrays. Merging involves combining two
sorted arrays into a single sorted array.
>> A = merge([2 8 11 20], [4 5 7 13 19 24])
A =
2 4 5 7 8 11 13 19 20 24

An example involving 1-d array


Given two segments of sorted arrays A and B, output
the result of merging them as a single sorted array.
B

merge(A, 2, 3, B, 9, 13) should return


0 1 2 3 4 5

12 2 3 4 4 5
merge(A, 2, 2, B, 9,10) should return the array 1 2 4
merge(A, 3, 4, B, 9, 8) should return 5 7 since the
second array is empty. (high index < low index means
the array is empty.)

What are the base cases?

What are the base cases?


one array segment is empty.
In this case, what is the output?

What are the base cases?


one array segment is empty.
In this case, what is the output?
The other array segment, so we just have
to copy the segment to the output.

What are the base cases?


one array segment is empty.
In this case, what is the output?
The other array segment, so we just have
to copy the segment to the output.
what if both segments are not empty? We
need to make recursive call.

Before we proceed, we need to make a

change to the prototype of the function


merge. Why?
We need to add two more parameters - the
name of the array and the starting index in
the output array at which we want to write.

Merge function
function out = merge(A, B)
if length(A)==0
out = B;
elseif length(B) == 0
out = A;
else
if A(1) <= B(1)
temp =A(1);
out = [temp, merge(A(2:end),B)];
else
temp = B(1);
out = [temp, merge(A,B(2:end))];
end;
end;

Merge-sorting
To sort an array, recursively sort the two halves, then
apply merge.

function out=mergesort(A)
if length(A)==1
out = A;
else
s = length(A);
mid = floor(s/2);
out1 = mergesort(A(1:mid));
out2 =
mergesort(A(mid+1:end));
out = merge(out1, out2);
end

Exercise 8.1.
>> repeat([2 3; 3 1; 4 2]
ans =
[222344]

Exercise 8.1.
>> repeat([2 3; 3 1; 4 2]
ans =
[222344]

function out = repeat1(m)


out = [];
[r, c] = size(m);
for i = 1 : r %go through each row
for j = 1 : m(i, 2)
%Repeat the number of times specified in the second column
out(end + 1) = m(i, 1);
end
end

Exercise 8.4. Write a function myfind, that mimics


the behavior of the built-in function find. That is, it
takes as input a boolean vector of 1s and 0s.

Exercise 8.4. Write a function myfind, that mimics


the behavior of the built-in function find. That is, it
takes as input a boolean vector of 1s and 0s.
function out = myfind(A, x)
out = [];
for j = 1:length(A)
if A(j) == x
out = [out, j];
end;
end;

Exercise 8.8
Write a function intoBits to take an integer number
as input and output a string of 0s and 1s
representing the number in base 2.

Exercise 8.11
Write functions minAll, minCol and minRow that find
the overall minimum, column minima and row
minima of a matrix A.

Exercise 8.11
Write functions minAll, minCol and minRow that find
the overall minimum, column minima and row
minima of a matrix A.
min(min(matrix)) %Minimum element of the whole matrix
min(matrix); %Minimum element of each column
min(transpose(matrix)); %Minimum element of each row

Lec 13

Oct

You might also like