Ich habe den folgenden Code, der die Anzahl von Knoten in einem Baum zurückgibt, wenn eine vollständige Binary Tree layer
Schichten groß ist:Warum ist dieser lange Überlauf auf -1, anstelle des Mindestwerts für den Typ?
public static long nNodesUpToLayer(int layer) {
if (layer < 0) throw new IllegalArgumentException(
"The layer number must be positive: " + layer);
//At layer 0, there must be 1 node; the root.
if (layer == 0) return 1;
//Else, there will be 1 + 2 * (the number of nodes in the previous layer) nodes.
return 1 + (2 * nNodesUpToLayer(layer - 1));
Das Seltsame ist, wenn ich Eingang 63
in die Funktion (der minimale Wert, produziert dies), gibt es mir -1
zurück. Bei 62
gibt es 9223372036854775807
zurück, so dass dies durch einen Überlauf verursacht wird.
Sollte es mir nicht lange + die Menge der Minimalwert von Java zurückgeben, die sie durch überschwemmt wurde? Unabhängig von der Eingabe, die ich es gebe (bestanden 62
), wird es immer -1
anstelle einer scheinbar zufälligen Zahl, die ich von einem Überlauf erwarten würde.
Ich bin nicht ganz sicher, wie dies zu debuggen, da es rekursiv ist, und der Wert Ich habe Interesse an wird nur ausgewertet werden, wenn die die Funktion des Basis-Fall erreicht hat.
Ich werde nur verlassen ** [this] (https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html) * * hier und geh weg ... –
@Snowman Danke für den Vorschlag. Jetzt weiß ich, dass ein Baum der Höhe '1000' hat' 21430172143725346418968500981200036211228096234110672148875007767407021022498722449863967576313917162551893458351062936503742905713846280871969155149397149607869135549648461970842149210124742283755908364306092949967163882534797535118331087892154125829142392955373084335320859663305248773674411336138751' Knoten. Ich bin wirklich erstaunt, wie schnell es das berechnen konnte. Ich habe erwartet, dass 'BigInteger' massiven Overhead (oder so habe ich gehört) eingeführt hat, aber das ist fast sofort beendet. – Carcigenicate
BigDecimal hat den Ruf, mit bestimmten Arten von Mathe langsamer zu sein, aber BigInteger funktioniert generell gut auf moderner Hardware (amd64) mit seinen riesigen Caches und zusätzlichen Registern. (Ja, ich weiß, dass BD BI intern verwendet, aber diese Skalierung kann die Leistung für einige Zahlenkombinationen und mathematische Operationen erheblich beeinträchtigen). –