3 f#
我正在研究Project Euler的问题四,并且遇到了stackoverflow异常.我不是在寻求解决问题的帮助,我只是想解释为什么我得到一个stackoverflow异常.这通常是因为无限递归,但我不相信这次就是这种情况(如果我只是盲目而且现在没有看到它请告诉我).
这是代码:
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);
Run Code Online (Sandbox Code Playgroud)
;
Bri*_*ian 10
您是在"调试"模式还是"发布"模式下编译?VS中的调试模式默认情况下关闭尾调用(编译器标志"--tailcalls-"),以便保留用于调试的堆栈,但这需要权衡StackOverflow.您可以切换到"发布"模式,或
使用"调试"设置打开尾调用.
(启用尾调用后,您的程序运行正常.)
| 归档时间: |
|
| 查看次数: |
568 次 |
| 最近记录: |