Come esce questa funzione ricorsiva? [chiuso]

-2

Nella parte merge_sort, ci sono più chiamate alla stessa funzione all'interno del ricorsivo. Come vengono eseguiti gli altri due quando la definizione afferma che finché una condizione non è falsa, la ricorsione non si ferma?

T tempArray[right - left + 1];

        int pos = 0;
        int left_pos;
        int right_pos = mid + 1;

        while (left_pos <= mid && right_pos <= right) {

            if (array[left_pos] < array[right_pos]) {
                tempArray[pos++] = array[left_pos++];

            } else {
                tempArray[pos++] = array[right_pos++];
            }
        }

        while (left_pos <= mid) {
            tempArray[pos++] = array[left_pos++];
        }

        while(right_pos <= right) {
            tempArray[pos++] = array[right_pos++];

        }

        for(int iter = 0; iter < pos; iter++) {
            array[iter + left] = tempArray[iter];
        }

        return;
}

static void merge_sort(T* array, int left, int right) {

        int mid = (right + left) / 2;

        // We have to sort only when left < right because when left==right it is anyhow sorted

        if (left < right) {
            // Sort the left part//

            merge_sort(array, left, mid);

            merge_sort(array, mid + 1, right);

            _merge(array, left, mid, right);
        }

        return;
    }
}
    
posta Harsha Vardhan K 03.07.2016 - 18:02
fonte

1 risposta

6

Una funzione ricorsiva progettata correttamente ha sempre tre elementi:

  1. Il lavoro che si verifica nella chiamata alla funzione corrente,
  2. La chiamata della funzione ricorsiva e
  3. La strategia di uscita.

La strategia di uscita nel codice della tua domanda si verifica nella prima funzione quando tutte le condizioni di tempo sono finalmente soddisfatte e la funzione esegue l'istruzione return .

Dai un'occhiata a questa eccellente animazione da blog di Penjee , che illustra come una funzione ricorsiva di Fibonnaci funziona:

Si noti che i valori di ritorno si combinano per produrre il valore finale per la funzione e in che modo la strategia di uscita bolle dalla parte inferiore dell'albero delle chiamate verso l'alto. Questo essenzialmente funziona allo stesso modo nella funzione TempArray nella tua domanda.

    
risposta data 03.07.2016 - 19:46
fonte

Leggi altre domande sui tag