Trouver la valeur maximum dans un tableau en utilisant la récursivité
Pour l'une des questions que j'ai été invité à résoudre, j'ai trouvé la valeur max d'un tableau à l'aide d'une boucle for, j'ai donc essayé de le trouver en utilisant la récursivité et c'est ce que je suis venu avec:
public static int findMax(int[] a, int head, int last) {
int max = 0;
if (head == last) {
return a[head];
} else if (a[head] < a[last]) {
return findMax(a, head + 1, last);
} else {
return a[head];
}
}
De sorte qu'il fonctionne très bien et obtient la valeur max, mais ma question est : est-il ok pour le cas de base de retour d'un[tête] et pour le cas où la valeur en tête est > la valeur à la fin?
- Avez-vous tester cette?
- Oui je l'ai fait, et ça fonctionne
- ce n'est pas votre faute, mais c'est totalement idiodic pour trouver la valeur max d'un tableau via la récursivité. C'est une mauvaise utilisation de la récursivité technic.
- En gros, je sais comment obtenir la valeur max à l'aide d'une boucle for, j'ai donc voulu essayer d'écrire le code en utilisant la récursivité
- Cela devrait échouer pour le tableau
{2,42,1}
si la tête=0 et la dernière=2, la méthode retourne 2 sans recursing. - il retourne en fait 42 comme une valeur max..EDIT: nevermind, vous avez raison!
- Je pense que je devrais modifier le code de la restitution de la tête aux else return findMax(un,la tête,le dernier-1)
Vous devez vous connecter pour publier un commentaire.
Vous pourriez tout aussi bien le faire avec un seul compteur, juste l'index de la valeur que vous souhaitez comparer ce temps:
Ce bien meilleure montre ce qui se passe, et utilise la valeur par défaut "récursivité" mise en page, par exemple, avec une base commune de l'étape. L'appel Initial est de faire
findMax(a, a.length-1)
.if(index)
ne compile pas 😉Math.max
fait ce que votreif (a[head] < a[last])
n'a, pour l'essentiel. C'est en gros Diviser et Conquérir, où vous n'poignée de l'index en cours et le résultat de tout le reste (l'appel récursif) et les fusionner ensemble pour la réponse. Dans ce cas, vous souhaitez que le maximum d'entre eux, de sorte que vous fusionner avecMath.max
.C'est en fait beaucoup plus simple que cela. Le cas de base est que si vous avez atteint la fin du tableau (le 'else' une partie de la ternaire bloc de contrôle ci-dessous). Sinon vous retourner le max du courant et de l'appel récursif.
À chaque élément, il est de retour la plus grande de l'élément courant, et de tous les éléments avec un plus grand indice.
Integer.MIN_VALUE
seront retournés seulement sur des tableaux vides. Cela s'exécute en temps linéaire.Je voudrais résoudre ce problème en divisant le tableau à la moitié de chaque appel récursif.
où a et b sont des indices de tableau.
La condition d'arrêt est quand
b - a <= 1
, alors qu'ils sont voisins et le max est max(a,b);L'appel initial:
Cela réduit le maximum de profondeur de récursion de N log2(N).
Mais l'effort de recherche reste encore O(N).
Cela aurait pour conséquence
n
éléments sont visités, pourO(n)
. Sa ressemble un binaire de recherche est trompeur, parce que pour la recherche binaire d'un seul côté de l'arbre est visité, pour atteindre le plus profond de l'élément dansO(log n)
étapes, pour l'équilibre de l'arbre.Qu'en est ce une ?
Je sais que je suis un vieux Thread, mais peut-être que cela aide!
Je suis tombé sur ce fil et il m'a beaucoup aidé. Ci-joint mon code complet à la fois de la récursivité et de diviser&conquer cas.
Le temps d'exécution pour diviser&conquer est légèrement mieux que la récursivité.
Vous pouvez le faire de manière récursive comme suit.
Récurrentes concernant quelque chose comme cela.
Mise en œuvre est comme suit.
et appel ressemblera à ceci
son pas d'accord!
votre code ne sera pas trouver le maximum d'élément dans le tableau, il ne reviendra que l'élément qui a une valeur plus élevée que les éléments à côté d'elle, pour résoudre ce problème,la valeur maximale de l'élément dans la gamme peut être passé en argument de la méthode récursive.
Solution optimisée
Merci @Robert-Britannique pour la suggestion!
Mise à jour: Cette fonction suivante va récursive de démarrer à partir de l'index 0 et il va continuer à ajouter à cette valeur de l'indice jusqu'à ce qu'il est égal à la Longueur du tableau, si c'est plus nous devrions nous arrêter et retourner la valeur 0. Une fois que nous faisons cela, nous devons tirer le maximum de chacun des deux éléments dans le tableau, par exemple:
J'ai senti que l'utilisation d'un tracker pour la valeur maximale actuelle serait bon.