2010-03-02 27 views
3

我正在通过Project Euler学习F#的绳索,并且几次遇到以下问题。我写了一个函数,在F#交互窗口中运行它,程序挂在那里。我怀疑函数失败,但我没有得到任何重大的错误信息,这将帮助我找出错误。有什么方法可以调试在F#交互中运行的程序吗?
作为一个例子,下面是来自问题12的一个例子。FindFirstTriangle(0,0,100)运行正常,但当除数约为150时,事情就会卡住。
注意:这不是关于这段代码的错误,而是关于如何找出错误的地方!如何诊断F#交互式故障的来源

let NumberOfDivisors n = 
    [1 .. n] |> List.filter (fun i -> n % i = 0) |> List.length;; 

let HasMoreThanDDivisors n d = 
    if NumberOfDivisors n >= d then 
    true 
    else 
    false 

let rec FindFirstTriangle (index, number, divisors) = 
    if HasMoreThanDDivisors number divisors then 
    number 
    else 
    let nextIndex = index + 1 
    let nextNumber = number + index 
    FindFirstTriangle (nextIndex, nextNumber, divisors);; 

回答

3

如果您有例如运行你的'windows任务管理器'将会看到你的CPU在外挂时正在运行。你刚刚创造了太多的工作;你需要一个更高效的算法。按下F#交互中的'中断'键(在Visual Studio中的FSI窗口中按Ctrl-)以停止处理。

如果大哦不明确,你可以考虑添加一些打印来显示正在完成多少工作。例如。

let NumberOfDivisors n = 
    printf "%d" n // added 
    seq {1 .. n} |> Seq.filter (fun i -> n % i = 0) |> Seq.length;; 

let HasMoreThanDDivisors n d = 
    if NumberOfDivisors n >= d then 
    true 
    else 
    false 

let rec FindFirstTriangle (index, number, divisors) = 
    printfn "" // added 
    if HasMoreThanDDivisors number divisors then 
    number 
    else 
    let nextIndex = index + 1 
    let nextNumber = number + index 
    FindFirstTriangle (nextIndex, nextNumber, divisors);; 

然后用越来越大的数字运行FindFirstTriangle以了解发生了什么。

+0

感谢布赖恩。 Big-O很清晰,我知道我的算法效率很低,但我不确定问题是性能不佳还是发生异常。我认为,性能是责备:) – Mathias 2010-03-02 01:09:35

+0

是的,如果有例外,你会得到反馈 - 尝试它(在某处添加一个“raise(new Exception(”boom“)),看看Interactive如何表现)。 – Brian 2010-03-02 01:11:54

+0

另外,从您的答案中,我认为在Interactive中运行时,没有办法使用类似断点或监视的东西? – Mathias 2010-03-02 01:20:45

2

程序通常挂有两个原因:

  1. 死循环

  2. 低效的代码

在FP语言,如F#,这是非常罕见的,你写一个永久运行的死循环。

这是做欧拉当我调试散乱:

  1. 试验用小测试情况下,每个功能。当你写了一个函数,测试它。对于1 - 100算法是不太可能的,并且在101失败,特别是当你使用像F#这样的'安全'语言时。

  2. 估计算法的运行时间。如果是O(n^2),那么n = 10000可能是算法的上限。在这个问题中,答案已经超过70M,一个蛮力O(n^2)算法永远运行。而F#interactive提供了#time来分析程序的运行行为,比如运行时间和垃圾回收数量。

脑说,你需要一个更有效的执行NumberOfDivisorshttp://en.wikipedia.org/wiki/Euler%27s_totient_function

+0

感谢链接到总功能,非常有趣。 – Mathias 2010-03-03 19:06:15

相关问题