代码之家  ›  专栏  ›  技术社区  ›  Justin

f#堆栈溢出项目euler#4

f#
  •  3
  • Justin  · 技术社区  · 16 年前

    Project Euler 为什么 我遇到堆栈溢出异常。这通常是因为无限递归,但我不相信这次是这样(如果我只是失明,现在看不见,请告诉我)。

    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 回复  |  直到 11 年前
        1
  •  11
  •   Brian    16 年前

    您是在“调试”模式还是“发布”模式下编译?VS中的调试模式默认情况下关闭了尾部调用(编译器标志“--tailcalls-”),以保留用于调试的堆栈,但这有一个折衷方案,即您可能会遇到StackOverflow。您可以切换到“释放”模式,或者

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

        2
  •  0
  •   JRL    16 年前

    我不会读F#,也不知道你的问题是否与此有关,但特别是如果你在做递归的事情,避免检查与数字的相等性,而是尝试检查阈值。例如,不是测试n=0,而是测试n<= 0.