【问题标题】:OCaml partial application for quadratic root二次根的 OCaml 部分应用
【发布时间】:2019-06-14 09:45:29
【问题描述】:

我正在阅读 Jason Hickey 的 "Introduction to OCaml" 并坚持锻炼。

我想我理解这个例子,但我不明白如何编写一个函数r a b c,它可以通过定义r 来预先计算bc 的固定值的内容,例如:

let r b c a = 
(*...*)

其次,我看不出只有bc 可以预先计算什么东西...这里最复杂的部分是取b *. b -. 4. *. a *. c 的平方根,我无法计算没有a

【问题讨论】:

  • 您可以在没有a 的情况下计算根的一些项。例如,b*b4*c 是常量,如果 bc 已绑定。
  • @Richard-Degenne :是的,但是 sqrt 和除法需要很长时间,以至于预先计算一次加法和一次乘法不会改变时间。我也没有找到这个练习的答案......
  • 我不确定这里的目标是在时间上提供一个高效的程序,而是能够识别不依赖于给定变量的表达式的子部分。我认为 Richard-Degenne 的评论正是您想要的
  • 是的,这个练习不是经过深思熟虑的。他们很容易想出更好的部分应用示例,恕我直言。

标签: ocaml


【解决方案1】:

这个问题有两个方面,部分是关于数学,部分是关于部分应用(双关语)。

有一个值使判别公式变得微不足道,那就是c 等于 0。因此,我们可以为其提供一个高效的实现方式,

let discriminant_for_c = function
  | 0 -> fun b a _ -> a *. b /. 2.
  | n -> general_discriminant

let r b c a = (discriminant_for_c c) b c a

但是,经过再三思考,我相信这是练习中的拼写错误,并且是固定的 b 变量。事实上,使用固定的b,我们有更多有趣的解决方案。并将让它作为你的练习:)

此外,除了本练习的教学目的之外,请记住,在实际应用中,由于catastrophic cancelation,计算判别式通常是一个坏主意,并且有一个更准确的和稳定的algorithm 计算二次方程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2019-01-14
    • 2013-11-15
    • 2021-12-21
    相关资源
    最近更新 更多