# Exercise 2 solution

## Exercise

Consider method `mystery`.

``````public static void mystery(String str, int len)
{
if(str.length() < len)
{
System.out.print(str);
return;
}

System.out.print(str.substring(0, len));
mystery(str.substring(len), len);
System.out.print(str.substring(0, len));
}
``````

Which of the following describes what is printed by the call below?

`mystery("abcdef", 3);`

(A) `abcdefdefabc`
(B) `abcabcdefdef`
(C) `defabcabcdef`
(D) Many values are printed because of infinite recursion.
(E) Nothing is printed because of infinite recursion.

## Solution

(A) `abcdefdefabc`

## Explanation

Infinite recursion is a possibility, so it should be addressed first. The base case is `str.length() < len`. The initial call passes `3` as `len`. The recursive call is made with `str` without the first `len` characters and the same value of `len`. Repeatedly removing the first 3 characters of a string will eventually result in a string with fewer than 3 characters. The method is not infinitely recursive.

The recursive call is in the middle of two (identical) `print` statements. Each `print` statement prints the first `len` characters of `str`. The initial value of `str` is `abcdef`. The value of `len` is `3`.

Whatever the recursive call does, the first and last values printed will be `abc` (the first 3 characters of `abcdef`). This eliminates all answer choices except (A).

The `mystery` method prints groups of `len` characters twice, once in their original order followed by once in reverse order.

Additional calls to the method are below.

`mystery("abcdef", 2);` prints `abcdefefcdab`

`mystery("abcdefg", 2);` prints `abcdefgefcdab`

## Help & comments

Get help from AP CS Tutor Brandon Horn

Comment on Recursive methods with print statements