Java Reference
In-Depth Information
}
static BigInteger factorial(BigInteger n)
{
if (n.equals(BigInteger.ZERO))
return BigInteger.ONE;
else
return
n.multiply(factorial(n.subtract(BigInteger.ONE)));
}
}
Listing 4-33 compares four versions of the recursive factorial() method. This
comparison reveals the largest argument that can be passed to each of the first three
methodsbeforethereturnedfactorialvaluebecomesmeaningless,becauseoflimitson
the range of values that can be accurately represented by the numeric type.
The first version is based on int and has a useful argument range of0through 12.
Passing any argument greater than 12 results in a factorial that cannot be represented
accurately as an int .
Youcanincreasetheusefulrangeof factorial() ,butnotbymuch,bychanging
theparameterandreturntypesto long .Aftermakingthesechanges,youwilldiscover
that the upper limit of the useful range is 20.
To further increase the useful range, you might create a version of factorial()
whoseparameterandreturntypesare double .Thisispossiblebecausewholenumbers
canberepresentedexactlyas double s.However,thelargestusefulargumentthatcan
bepassedis170.0.Anythinghigherthanthisvalueresultsin factorial() returning
+infinity.
Itispossiblethatyoumightneedtocalculateahigherfactorialvalue,perhapsinthe
contextofcalculatingastatisticsprobleminvolvingcombinationsorpermutations.The
onlywaytoaccuratelycalculatethisvalueistouseaversionof factorial() based
on BigInteger .
When you run this application, as in java FactComp , it generates the following
output:
479001600
2432902008176640000
Search WWH ::




Custom Search