I am trying to implement this bit of code:
func factorial(x int) (result int) {
if x == 0 {
result = 1;
} else {
result = x * factorial(x - 1);
}
return;
}
as a big.Int so as to make it effective for larger values of x.
The following is returning a value of 0 for fmt.Println(factorial(r))
The factorial of 7 should be 5040?
Any ideas on what I am doing wrong?
package main
import "fmt"
import "math/big"
func main() {
fmt.Println("Hello, playground")
//n := big.NewInt(40)
r := big.NewInt(7)
fmt.Println(factorial(r))
}
func factorial(n *big.Int) (result *big.Int) {
//fmt.Println("n = ", n)
b := big.NewInt(0)
c := big.NewInt(1)
if n.Cmp(b) == -1 {
result = big.NewInt(1)
}
if n.Cmp(b) == 0 {
result = big.NewInt(1)
} else {
// return n * factorial(n - 1);
fmt.Println("n = ", n)
result = n.Mul(n, factorial(n.Sub(n, c)))
}
return result
}
This code on go playground: http://play.golang.org/p/yNlioSdxi4
In your
intversion, everyintis distinct. But in yourbig.Intversion, you’re actually sharingbig.Intvalues. So when you sayThe expression
n.Sub(n, c)actually stores0back inton, so whenn.Mul(n, ...)is evaluated, you’re basically doing0 * 1and you get back0as a result.Remember, the results of
big.Intoperations don’t just return their value, they also store them into the receiver. This is why you see repetition in expressions liken.Mul(n, c), e.g. why it takesnagain as the first parameter. Because you could also sayresult.Mul(n, c)and you’d get the same value back, but it would be stored inresultinstead ofn.Here is your code rewritten to avoid this problem:
And here is a slightly more cleaned-up/optimized version (I tried to remove extraneous allocations of
big.Ints): http://play.golang.org/p/feacvk4P4O