# lec12.py
# Lillian Lee (LJL2)
# Feb 27, 2013

"""Demo recursive functions."""
import random


def num_es2(s):
    """Returns: number of 'e's in string s.

    This implementation uses a random 'split point' to make two recursive calls
    on two smaller substrings.
    """

    if len(s) <= 1: # {base case: can't break into two smaller strings}
        return (1 if s == 'e' else 0)

    # {len(s) > 1}.  Must be careful to choose a 'split point' that makes
    # progress towards the base case: two smaller substrings
    i = random.randrange(1,len(s)) # {i in 1..len(s)-1}, so s[:i] != ''
    return num_es2(s[:i]) + num_es2(s[i:])


def ispalindrome(s):

    if len(s) < 2:
        return True

    # at least two characters
    return s[0] == s[-1] and ispalindrome(s[1:-1])


def reverse(s):
    """Returns: reverse of string s"""
    # base case
    if s == '':
        return s

    # idea: reverse of string <s> is reverse(s[1:]) + s[0]
    return reverse(s[1:]) + s[0]


def reverse2(s):
    """Returns: reverse of string s"""
    # alternate implementation

    if len(s) <= 1:
        return s

    return s[-1] + reverse(s[:-1])