Source code for src.ch02.c1_recursive_palindrome
"""Recursively determine if a word is a palindrome."""
from src.ch02 import RECURSIVE_ISPALINDROME_ERROR
[docs]def recursive_ispalindrome(word: str) -> bool:
    """Recursively check if a word is a palindrome.
    Args:
        word (str): String to check palindrome-ness.
    Returns:
        :py:obj:`True` if the word is a palindrome, :py:obj:`False` otherwise.
    Raises:
        TypeError: If **word** is not a string.
    """
    if not isinstance(word, str):
        raise TypeError(RECURSIVE_ISPALINDROME_ERROR)
    # Base case: if no letters or one letter, return True.
    if len(word) <= 1:
        return True
    # Recursive loop: if first and last letters are different, return False.
    # Otherwise, remove the first and last letters and call function again.
    if word[0] == word[-1]:
        return recursive_ispalindrome(word[1:-1])
    return False 
[docs]def main(word: str = None) -> None:
    """Demonstrate the recursive palindrome tester.
    This is only supposed to be a demo, but coverage necessitates
    excessiveness.
    Args:
        word (str): Word to test if it is a palindrome.
    Returns:
        :py:obj:`None`. Identifies **word** as a palindrome.
    """
    print('I\'m a recursive palindrome tester.\n'
          'I basically call on myself repeatedly to check if a string is a '
          'palindrome.\n'
          'Incidentally, my favorite food is Random Access Memory.\n')
    if word is None:
        word = 'rotor'
    print(f'Analyzing: {word}\n')
    if recursive_ispalindrome(word):
        print(f'I do declare that "{word}" is a palindrome!\n')
    else:
        print(f'I\'m afraid that "{word}" isn\'t a palindrome 😞') 
if __name__ == '__main__':
    main()