Ho il seguente codice che restituisce il numero di nodi in un albero, quando un albero completo binaria è layer
strati di altezza:Perché questo lungo traboccare a -1, invece del valore minimo per il tipo?
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));
La cosa strana è che quando ho ingresso 63
nella funzione (il valore minimo che produce questo), mi restituisce -1
. A 62
restituisce 9223372036854775807
, quindi questo sembra essere causato da un overflow.
Non dovrebbe restituirmi il valore minimo di Java lungo + l'importo da cui è stato sovraccaricato? Indipendentemente dall'input che gli ho dato (passato 62
), restituirà sempre -1
invece di un numero apparentemente casuale che mi aspetterei da un overflow.
Non sono completamente sicuro di come eseguire il debug di questo, poiché è ricorsivo e il valore a cui sono interessato verrà valutato solo dopo che la funzione ha raggiunto il caso base.
lascerò solo ** [questo] (https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html) * * qui e vai via ... –
@Snowman Grazie per il suggerimento. Ora so che un albero di altezza '1000' avrà' 21430172143725346418968500981200036211228096234110672148875007767407021022498722449863967576313917162551893458351062936503742905713846280871969155149397149607869135549648461970842149210124742283755908364306092949967163882534797535118331087892154125829142392955373084335320859663305248773674411336138751' nodi. Sono davvero stupito di quanto sia stato in grado di calcolarlo. Mi aspettavo che 'BigInteger' introducesse un sovraccarico (o così ho sentito), ma questo finì quasi all'istante. – Carcigenicate
BigDecimal ha la reputazione di essere più lento con certi tipi di matematica, ma BigInteger generalmente funziona bene su hardware moderno (amd64) con le sue gigantesche cache e registri extra. (Sì, lo so BD utilizza la BI internamente, ma quella scala può davvero rovinare le prestazioni per alcune combinazioni di numeri e operazioni matematiche). –