Dunque, supponi di avere l'array {1,9,8,2}.
All'inizio chiami
isOrdered(array, 0, 3) [fra l'altro nota che in realtà all'inizio dovresti chiamare isOrdered(a, 0, a.length-1), non quello che chiami tu, perché ti perdi un numero].
In ogni caso hai che array[0] < array[3], per cui calcoli m=1 e chiami
isOrdered(array, 0, 1) e
isOrdered(array, 2, 3). Concentriamoci solo sulla prima: hai che arrray[0] > array[1], quindi questa funzione restituisce false. Però per come è implementato attualmente te ne freghi di questo valore, che invece ti dice "ehi guarda, il sotto-array che va dall'indice 0 ad 1 non è ordinato". Di conseguenza il programma stampa sempre "true" anche se magari si accorge che un sotto-array non è ordinato.
Per cui dovresti avere una cosa del tipo
return isOrdered(a, inizio, m) && isOrdered(a, m+1, fine);
Poi passiamo alla questione dei confronti fra array[m] e array[m+1].
Considera l'array {1,2,8,4}.
Come prima la sequenza di chiamate sarà:
- isOrdered(array, 0, 3), cioè confronti array[0] con array[3]
- isOrdered(array, 0, 1), isOrdered(array, 2,3). Cioè confronti array[0] con array[1] e, successivamente, array[2] con array[3]
- isOrdered(array, 0, 0), isOrdered(array, 1, 1), isOrdered(array, 2, 2), isOrdered(array, 3, 3). Qua non effettui nessun confronto.
Come puoi vedere non effettui mai il confronto array[1] con array[2], che è proprio quello che ti permetterebbe di dire che l'array non è ordinato. Di conseguenza il tuo programma
in alcuni casi restituisce true invece di false.