/** Demo recursion */
public class D {
    
    // Notation:
    // Use s[c] for  s.charAt(c)
    // Use s[b..c-1] for s.substring(b..c]
    // Use s[b..]    for s.substring(1)
    
    /** = the length of s. The method cannot use s.length() */
    public static int len(String s) {
        if (s.equals("")) {
            return 0;
        }
        
        // s has at least 1 character
        // length of s = 1 + length of s[1..]
        return 1 + len(s.substring(1));
        

    }
    
    
    /** =  number of 'e's in s */
    //     "aEeme l" has 2 e's.
    public static int noE(String s) {
       if (s.length() == 0)   // Base case
           return 0;
       
       // s has at least 1 char
       // answer (if s[0] is 'e' then 1 else 0) +
       //        number of 'e's in s[1..]
       if (s.charAt(0) == 'e')
           return 1 + noE(s.substring(1));
                          
       // the first char of s is not 'e'
       return noE(s.substring(1));
    }
    
    /** = s with blanks removed 
         if s is "  b    c" output: "bc" */
    public static String remBlank(String s) {
        if (s.length() == 0)
            return s;
        
        // s has at least one char
        if (s.charAt(0) == ' ')
            return remBlank(s.substring(1));
        
        // the first char of s is not a blank
        return s.charAt(0) + remBlank(s.substring(1));
        
    }
    
    /** = n!.  Precondition: n >= 0.
      Def: 0! = 1.
      n!=  n*(n-1)*(n-2)*...*2*1 (for n > 0).
      6! = 6*5*4*3*2*1
      
      or     0! = 1
      n! = n * (n-1)!  (for n > 0) */
    public static int fact(int n) {
        if (n == 0)
            return 1;
        
        // n > 0
        return n * fact(n-1);
        
    }
    
    //noon
    //ablewasIereIsawelba
    // A man, a plan, a canal, panama!
    // amanaplanacanalpanama!
    
    /** = "s is a palindrome" (reads same backward and forward) */
    public static boolean isPal(String s) {
        if (s.length() <= 1)
            return true;
        
        // s has at least 2 characters
        int pl= s.length()-1;
        return s.charAt(0) == s.charAt(pl) &&
               isPal(s.substring(1, pl));
    }
    
    
}