James Wong:
Je dois simuler une pile d'appel. Maintenant, je l'ai déjà mis en place ma pile, maintenant, je me demande s'il y a un moyen de stocker le nom de la méthode dans le tableau.
Par exemple, j'ai une fonction récursive qui boucle 5 fois, de sorte que la pile sera:
recur() //fifth
recur() //fourth
recur() //third
recur() //second
recur() //first
mais est-il de toute façon de les stocker dans un tableau et l'afficher sur? Je n'ai pas se soucier de ce qu'il fait dans la fonction récursive, je veux juste afficher le nom de la pile et la séquence et comment il fonctionne.
Ezequiel:
Vous pouvez compter le nombre d'invocations sans passer tout nouveau paramètre à la recur
méthode.
recursiveMethodCount
filtre la trace de la pile en cours et compte les ocurrences.
import java.util.Arrays;
public class StackTrace {
public static void main(String[] args) {
recur();
}
public static void recur() {
long recursionLevel = recursiveMethodCount("StackTrace", "recur");
if (recursionLevel < 10) {
System.out.println(String.format("Recursion level is %d, invoking recur() again.", recursionLevel));
recur();
} else {
System.out.println(String.format("Recursion level is %d, no more invocations.", recursionLevel));
}
System.out.println(String.format("Recursion level is %d, returning.", recursionLevel));
}
public static long recursiveMethodCount(String declaringClass, String methodName) {
return Arrays.stream(Thread.currentThread().getStackTrace())
.filter(stackTraceElement -> stackTraceElement.getClassName().equals(declaringClass))
.filter(stackTraceElement -> stackTraceElement.getMethodName().equals(methodName))
.count();
}
}
La sortie de ce code est
Recursion level is 1, invoking recur() again.
Recursion level is 2, invoking recur() again.
Recursion level is 3, invoking recur() again.
Recursion level is 4, invoking recur() again.
Recursion level is 5, invoking recur() again.
Recursion level is 6, invoking recur() again.
Recursion level is 7, invoking recur() again.
Recursion level is 8, invoking recur() again.
Recursion level is 9, invoking recur() again.
Recursion level is 10, no more invocations.
Recursion level is 10, returning.
Recursion level is 9, returning.
Recursion level is 8, returning.
Recursion level is 7, returning.
Recursion level is 6, returning.
Recursion level is 5, returning.
Recursion level is 4, returning.
Recursion level is 3, returning.
Recursion level is 2, returning.
Recursion level is 1, returning.