Je suis en train de résoudre des "Perles de programmation". 4.11 disent:Recherche binaire en C avec fonction récursive n'acceptant que la longueur
Ecrire et prouver l'exactitude d'une fonction de recherche binaire récursive en C ou C++ avec cette déclaration:
int binarySearch (DataType x [], int n);
Utilisez cette fonction uniquement; n'appelle pas toute autre fonction récursive.
je suis venu avec:
int bsearch_rec_array_only(int key, int* arr, int n)
{
int mid;
if (n < 0)
return -1;
mid = n/2;
if (arr[mid] == key)
return (int) ((size_t) arr + mid * sizeof(*arr));
else if (arr[mid] < key)
return bsearch_rec_array_only(key, arr + mid + 1, n - mid - 1);
else
return bsearch_rec_array_only(key, arr, mid - 1);
}
Cependant - il y a un problème. Je retourne le décalage y compris l'adresse du tableau car sinon comment connaître le décalage relatif de l'élément au tableau d'origine?
Je besoin de cette enveloppe:
int bsearch_array_only_wrap(int key, int* arr, int n)
{
int offset;
if (n == 0)
return -1;
offset = bsearch_rec_array_only(key, arr, n);
if (offset == -1)
return -1;
else
return (offset - (int) arr)/sizeof(*arr);
}
Ce n'est pas récursive - il appelle simplement bsearch_rec_array_only
et calcule le décalage.
Mais cela semble compliqué. Pouvez-vous trouver une meilleure solution?
Cela fonctionne si vous pensez à vérifier -1 sur les appels récursifs. – Rickard
Vous avez raison, j'espère que c'est correct maintenant. – Amnon
mais 'return mid' ne fonctionne pas, car le tableau que voit un appel récursif n'est pas le tableau réel, mais un décalage – zaharpopov