Given a relatively simple problem —involving numbers or an array, say— that is amenable to a recursive solution, be able to describe such a solution.
A similar effect (of producing objects of the same class having different behaviors) can be achieved by using an instance variable that provides some particular functionality (e.g., comparison, classification) as described in a Java interface (e.g., java.util.Comparator or RedBlueClassifier from Lab #10). Also see Generic Comparator-based Sorting in Java. Indeed, this is usually a better approach than using extension.
For example, if coin is a variable declared to be of type Coin but it is bound to an object of the class BiasedCoin (as would happen as a result of an assignment statement such as coin = new BiasedCoin(0.4)), the version of the toss() method executed as a result of the call coin.toss() is the one found in the BiasedCoin class (which overrides the version of the method inherited from its parent Coin class).
Meanwhile, if coin is declared to be of type Coin, then the call coin.headsProbability() will be flagged as an error by the Java compiler, regardless of whether or not that call occurs in a context in which it is guaranteed that coin would have been bound to an instance of the BiasedCoin class. (Recall that the method headsProbability() does not exist in the Coin class but rather was introduced in its child class BiasedCoin.)