public class ExtIntSequenz extends IntSequenz {

    public int laenge (IntSequenz s) {
        return isEmpty(s) ? 0 : laenge(rest(s)) +1;
    }

    public boolean istAnfang (IntSequenz a, IntSequenz s) {
        return isEmpty(a) ? true
               : isEmpty(s) ? false
                 : first(a) != first(s) ? false
                   : istAnfang (rest(a), rest(s)) ;
    }
      
    public boolean istTeilsequenz (IntSequenz t, IntSequenz s) {
        return isEmpty(t) ? true
               : isEmpty(s) ? false
                 : istAnfang(t,s) ? true
                   : istTeilsequenz (t, rest(s)) ;
    }

    private int minimumBett (IntSequenz s, int altesMin) {
        return isEmpty(s) ? altesMin
               : first(s) < altesMin ? minimumBett(rest(s), first(s))
                                     : minimumBett(rest(s), altesMin) ;
    }

    public int minimum (IntSequenz s) { // Voraussetzung: s nicht leer!
        return minimumBett( rest(s), first(s) );
    }

    private int min (int a, int b) {
        return a<b ? a : b ;
    }

    public int minimum2 (IntSequenz s) { // Voraussetzung: s nicht leer!
        return isEmpty(rest(s)) ? first(s)
                                : min( first(s), minimum2(rest(s)) ) ;
    }
}

