2016-05-16 4 views
0

J'apprends actuellement Java et je suis tombé sur un exercice que je ne peux pas terminer.Java recursive difference in array

La tâche consiste à écrire une méthode récursive qui prend un tableau et renvoie la différence entre la plus grande et la plus petite valeur. Par exemple, {12, 5, 3, 8} doit renvoyer 5 (8 - 3). Il est important de noter qu'il est seulement permis de comparer les valeurs dans le bon ordre (result = rightValue - leftValue). Par exemple 12-3 = 9 ne serait pas autorisé. Pensez-y comme des valeurs boursières. Vous voulez savoir à quelle heure acheter et vendre les actions pour faire le plus gros bénéfice.

Il était facile d'implémenter ce itératif mais je n'ai aucune idée de comment le faire récursif. Aussi, il est de la tâche de le résoudre en utilisant diviser pour régner.

+4

montrez ce que vous avez essayé jusqu'à présent – attaboy182

+0

@ Turing85 Non n'est pas seulement autorisé à comparer les valeurs dans le leur d'ordre. Pensez-y comme des valeurs boursières. Vous voulez savoir à quelle heure acheter et vendre les actions pour faire le plus gros bénéfice. –

+0

Il y a trop de réponses possibles, ou de bonnes réponses seraient trop longues pour ce format. Veuillez ajouter des détails pour affiner le jeu de réponses ou pour isoler un problème auquel il est possible de répondre en quelques paragraphes. + Votre exemple n'a pas de sens pour moi. –

Répondre

0

Je l'ai utilisé diviser pour mieux régner approche ici. Je crois que l'astuce ici est d'inclure le milieu dans les deux tableaux dans lesquels nous divisons le tableau principal.

/* cas de pointe ici * ignorés/

int findMax(int[] arr, int left, int right){ 

if(right-left == 1) return (arr[right]-arr[left]); 

int middle = left + (right-left)/2; 

int max1 = findMax(arr, left, middle); 
int max2 = findMax(arr, middle, right); 

if(max1 >= 0 && max2 >= 0) return max1+max2; 

else return Math.max(max1,max2); 

} 
+0

Cela a résolu ma question, merci beaucoup! –

+0

Pourriez-vous expliquer pourquoi le milieu doit être 'gauche + (droite-gauche)/2'? Je m'attendais à ce que ce soit seulement '(droite-gauche)/2'. –

-3

algorithme (ce qui est à peu près une tâche de tri, puis l'étape de soustraction est trivial)

1) Trier d'abord les tableaux (utilisez sorte de fusion récursive pour les grands tableaux et insertion récursive pour les tableaux plus petits).

tri fusion (https://en.wikipedia.org/wiki/Merge_sort)

type d'insertion (https://en.wikipedia.org/wiki/Insertion_sort)

2) Utilisez les tableaux le plus petit index [0] pour obtenir l'indice de valeur & plus petit [array.length-1] pour obtenir le plus grand

3) calculer la différence (ne sais pas ce que vous entendez par ordre?)

+0

Il en résultera 12 - 3 = 9, ce que OP a clairement dit n'est pas la réponse. – mks

+0

Si vous trier le tableau, vous n'avez pas à vous soucier de la commande. On m'a spécifiquement demandé d'implémenter un algorithme de division et de conquête. –

+0

Je dois admettre que je n'ai pas fait un bon travail pour expliquer mon problème. Cette tâche est destinée à simuler un marché boursier. Vous essayez de maximiser votre profit en achetant au plus bas prix et en vendant au plus haut. –

0

Eh bien, je ne pense pas que la récursivité est très efficace sur ce point. Vous ne feriez probablement jamais cela (autre que les devoirs). Quelque chose comme ça le ferait:

int findGreatestDifference(Vector<Integer> numbers, int greaterDifference){ 
    if(numbers.size() == 1) //return at last element 
     return greaterDifference; 
    int newDifference = (numbers.get(0) - numbers.get(1)); 
    if (newDifference > greaterDifference) 
     greaterDifference = newDifference; 

    numbers.remove(numbers.size() - 1); 
    findGreatestDifference(numbers, greaterDifference); 
    return greaterDifference; 
} 

première fois que vous appelez, passer 0 comme une plus grande différence, et encore je ne trouve pas cela comme un moyen efficace de le faire. L'itération serait bien meilleure pour cela.

J'espère que cela aide.

+0

Je sais que la récursivité est stupide pour cet exercice mais une partie de l'exercice était itérative et l'autre le fait avec récursivité. Merci de votre aide! –