2017-01-15 1 views
1

Je suis en train d'écrire élément du tableau dans l'ordre inverse et je suis tombé sur cet exempleC++: fonction récursive pour le tableau

template <class T> 
void reverse(T arr[], int size) 
{ 
    if (size>=2) 
    { 
     swap(arr[0],arr[size-1]); 
     reverse(arr+1,size-2); 
    }  
} 

Je ne reçois pas la deuxième ligne - pourquoi sont-ils en soustrayant la taille le tableau par 2? Si j'ai 10 éléments dans la fonction "swap" en la soustrayant de 1 pour échanger le premier élément avec le dernier élément, puis le soustraire de 2 me donnerait 8 mais en réintégrant la taille dans la fonction "swap" 7!! ne devrait-il pas être 8 au lieu de 7?

+0

D'où obtenez-vous 7? Si 'size' est 10,' size-2' est 8. 'size-1' ne modifie pas' size' . – molbdnilo

Répondre

2

La fonction fonctionne en échangeant les premier et dernier éléments de la matrice, puis faire récursivement la même chose pour le sous-réseau [1]-[size-2], comme celui-ci (l'exemple suppose un tableau avec 7 éléments):

|0 1 2 3 4 5 6| <-- the array as supplied to the function 
6|1 2 3 4 5|0 <-- swap [0] with [6], call recursively for 1..5 
6 5|2 3 4|1 0 <-- swap [1] with [5], call recursively for 2..4 
6 5 4|3|2 1 0 <-- swap [2] with [4], call recursively for 3..3 
6 5 4 3 2 1 0 <-- do nothing because the size is less than 2 

La taille diminue de 2 à chaque étape car 2 éléments ont été échangés et sont maintenant dans l'ordre souhaité.

0

Je pense que ce code est correct. Voyons ce qui est fait avec un tableau de 4 éléments: [0,1,2,3]

Premier appel, arr = [0,1,2,3] et taille = 4. La taille est supérieure à 2 , donc nous échangeons les premier et dernier éléments. arr = [3,1,2,0]. Maintenant est l'appel inverse avec arr = [1,2,3] et taille = 2. Que va-t-on faire? swap (arr [0] = 1 , [size-1 = 2-1 = 1] arr = ] . Le nouveau réseau est [3,2,1,0]. La deuxième ligne exclure le dernier élément du tableau, qui a déjà été fait