Perché 'length - 2' ti dà ricorsivamente il centro di una lista collegata?

4

Sto leggendo un libro di Algorithms e sto lavorando a una soluzione ricorsiva alla seguente domanda:

Implement a function to check if a linked list is a palindrome

Questo è un compito abbastanza facile, ma il libro suggerisce una soluzione ricorsiva che non riesco a spiegarmi. Afferma che per sapere quando siamo al centro dell'elenco collegato, possiamo eseguire la seguente operazione:

recurse(Node n, int length) {
  if (length == 0 || length == 1) {
    return [something]; // At middle
  }
  recurse(n.next, length - 2);
  ...
}

Perché length - 2 ti riporta ricorsivamente al centro? Qualcuno può spiegarlo in dettaglio? Capisco che funzioni, ma non matematicamente perché funzioni.

    
posta ApathyBear 21.09.2015 - 21:47
fonte

1 risposta

19

Se avanzi di un passo e ne sottrai due dalla lunghezza, ottieni una nuova sottolista con le estremità rimosse. Osserva che il codice non si limita a sottrarre alla lunghezza. Avvia la sottolista in n.next .

Ad esempio, inizia con la lista abcde, con lunghezza 5. Alla prima iterazione, hai la sottolista di lunghezza 3 che inizia alla seconda posizione, o bcd. Nel secondo, si ottiene la sottolista di lunghezza 1 che inizia alla seconda posizione della sottolista (la terza posizione dell'elenco originale), o c. Poiché la lunghezza è 1, ti fermi, e questa è la posizione centrale.

    
risposta data 21.09.2015 - 21:52
fonte

Leggi altre domande sui tag