15A. Recursive Search Algorithms


Recursive search algorithms

NextPrime

We have seen how to write scan algorithms using recursion, but what about search algorithms? NextPrime is easy to do.

  int nextPrime(const int n)
  {
    if(isPrime(n+1))
    {
      return n+1;
    }
    else
    {
      return nextPrime(n+1);
    }
  }

That is, if n+1 is prime, then the smallest prime number that is greater than n must be n+1. But if n+1 is not prime, then get the smallest prime number that is greater than n+1.

Member

Recall that we used a loop to write a definition of member(x, A, n), which returns true if at least one of the values A[0], … A[n−1] is equal to x. Let's do it using recursion. There are three cases. Each assumes that the preceding cases did not apply.

  1. Member(x, A, n) asks whether any of the first n variables in array A holds x. If n = 0, then that cannot possibly be true, since there are no values to look at.

  2. If A[n−1] = x, then yes, one of A[0], …, A[n−1] is equal to x. (Note that it is critical to handle the case where n = 0 first. If n = 0 then n−1 = −1, and there is no such thing as A[−1].)

  3. If neither of the preceding cases is applicable, then n > 0 and A[n−1] ≠ x. In that case, member(x, A, n) is true if and only if member(x, A, n−1) is true. (We can ignore A[n−1] since it is not equal to x.)

Here is a definition of member based on those observations.

  bool member(const int x, const int A[], const int n)
  {
    if(n == 0)
    {
      return false;
    }
    else if(A[n-1] == x)
    {
      return true;
    }
    else
    {
      return member(x, A, n-1);
    }
  }

AllPositive

Carrying on the same ideas, here is a recursive definition of allPositive. Note that allPositive(A, 0) is true, since there are not any non-positive numbers among the first 0 members of array A.

  bool allPositive(const int A[], const int n)
  {
    if(n == 0)
    {
      return true;
    }
    else if(A[n-1] <= 0)
    {
      return false;
    }
    else
    {
      return allPositive(A, n-1);
    }
  }

Exercises

  1. Using recursion, write a definition of ascending(A, n), which returns true if A[0], … A[n−1] are in strictly ascending order, where A is an array of integers. If n = 1, the array is in ascending order. Answer

  2. Write a recursive definition of anyPrime(a, b), which returns true if any of the numbers a, a + 1, … b are prime. If a > b then anyPrime(a, b) is false. Answer