@up:
Wada jest taka, że to nie jest rekurencja ogonowa i łatwo o przepełnienie stosu tutaj, bo kompilator nie zoptymalizuje ci tego do pętli. Ale to tylko dygresja :)
Update:
Wersja z rekurencją ogonową w Javie, chociaż HotSpot nie rozwija rekurencji ogonowej (a więc bez dodatkowego przetworzenia kodu/ bajtkodu nie ma sensu używanie rekurencji ogonowej pod HotSpotem):
public class Main {
private void run() {
System.out.println(greatestElementIndex(new int[]{2, 3, 4, 5, 6, 7}));
System.out.println(greatestElementIndex(new int[]{7, 6, 5, 4, 3, 2}));
System.out.println(greatestElementIndex(new int[]{2, 3, 4, 4, 3, 2}));
System.out.println(greatestElementIndex(new int[]{2, 3, 2, 4, 1, 3}));
System.out.println(greatestElementIndex(new int[]{1, 0, 0, 0, 0, 0}));
System.out.println(greatestElementIndex(new int[]{}));
System.out.println(greatestElementIndex(new int[]{0}));
}
public int greatestElementIndex(int[] array) {
return greatestElementIndex(array, 0, -1, Integer.MIN_VALUE);
}
private int greatestElementIndex(int[] array, int index,
int greatestIndex, int greatestValue) {
if (index == array.length) {
return greatestIndex;
} else if (array[index] >= greatestValue) {
return greatestElementIndex(array, index + 1, index, array[index]);
} else {
return greatestElementIndex(array, index + 1, greatestIndex, greatestValue);
}
}
public static void main(String[] args) {
new Main().run();
}
}
PS:
Wg mnie ten kod jest dużo łatwiejszy do wytłumaczenia dla nowicjusza.