Reputation:
I'm working on problem four of Project Euler and am running into a stackoverflow exception. I'm not asking for help on solving the problem, I'd just like it explained why I am getting a stackoverflow exception. It's usually because of infinite recursion but I don't believe that is the case this time (if I'm just blind and not seeing it right now please let me know).
Here's the code:
let Euler4 =
let reverse sum =
let rec loop (n,x) =
if n = 0
then
x
else
loop (n/10,(x*10) + (n%10))
loop (sum, 0);
let isPalindrome arg = (arg = (reverse arg));
let findPalindromes (startx,starty) =
let rec loop (x,y) acc =
let result = if isPalindrome (x * y) then ((x,y) :: acc) else acc;
let next = match (x,y) with
| (x,y) when y = 100 -> (x-1,starty)
| _ -> (x,y-1)
if x = 100 then
result
else
loop (next) result
loop (startx,starty) [];
let value = (999,999);
printfn "%A" (findPalindromes value);
;
Upvotes: 3
Views: 598
Reputation: 118935
Are you compiling in 'Debug' mode or 'Release' mode? Debug mode in VS has tail calls turned off by default (compiler flag "--tailcalls-"), in order to preserve stacks for debugging, but this has the trade-off that you may StackOverflow. You can either switch to 'Release' mode, or
to turn on tail calls with 'Debug' settings.
(Your program runs fine for me with tail calls enabled.)
Upvotes: 11
Reputation: 78033
I can't read F# and don't know if your problem is related to this but especially if you're doing something recursive avoid checking for equality to a number, instead try to check for a threshold. For example, instead of testing n = 0, test n <= 0.
Upvotes: 0