So for my first bit of fun with F# I figured it'd be fun to play with the BigNum (used for crazy big numbers) I figured I write up some quick functions that simple generate the power of some number, resulting in some crazy big numbers :)
(*all of my examples include '#light')
My first function doesn't use the BigNum but it's very simplistic.
let rec pwrof x y =
if y = 1 then
x
else
x * pwrof x (y - 1)
So for everyone new to F# 'pwrof' is a recursive function that takes 2 ints. 'rec' lets the compiler know that the function is recursive and the 2 parameters get resolved down to being ints at compile time. This came pretty naturally for me coming from a C# world, so lets try to mix it up a bit.
let rec pwrof x y =
match y with
| 1 -> x
| _ -> x * pwrof x (y - 1)
This function does the exact same thing, but instead of using a familiar if/else statement we're using pattern matching (these are widely used in F#). It's like a switch statement. If y matches 1 then we return x, otherwise if y matches anything else, '_', then we recurse.
These were kinda fun, but I wanted to calculate crazy big power of calculations like 5000^5000. So here's an example that resembles my first function
let bpwrof x y =
let x = Microsoft.FSharp.Math.BigNum.of_int x
let pwr = x
let rec pwrof x y =
if y = 1 then
x
else
pwrof (x * pwr) (y - 1)
pwrof x y
And here's an example that resembles my second function
let bpwrof x y =
let x = Microsoft.FSharp.Math.BigNum.of_int x
let pwr = x
let rec pwrof x y =
match y with
| 1 -> x
| _ -> pwrof (x * pwr) (y - 1)
pwrof x y
These are tail recursive so you can create some really, REALLY big numbers. If you call one of the last 2 functions you can calculate say 5000 to the 9000th power. It ends up taking a lot more time to print the result to the screen than it does to do the calculation(its pages and pages of number madness). I even tried 5000 to the 90,000th pwr, that's a big number.
Oh well, that's all for now...
No comments:
Post a Comment