f#stackoverflow项目euler#4

时间:2009-09-12 23:16:34

标签: 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);

2 个答案:

答案 0 :(得分:10)

您是在“调试”模式还是“发布”模式下编译? VS中的调试模式默认情况下关闭尾调用(编译器标志“--tailcalls-”),以便保留用于调试的堆栈,但这需要权衡StackOverflow。您可以切换到“发布”模式,或

  • 在解决方案资源管理器中右键单击项目属性,然后选择“属性”
  • 转到“构建”标签
  • 确保选择“调试”配置
  • 点击“生成尾调用”

使用'Debug'设置打开尾调用。

(启用尾调用后,您的程序运行正常。)

答案 1 :(得分:0)

我无法读取F#并且不知道您的问题是否与此相关,尤其是如果您正在做一些递归操作,请避免检查数字的相等性,而是尝试检查阈值。例如,不是测试n = 0,而是测试n <= 0。