如何处理 F# 中的负电源?

How to handle negative power in F#?

我正在尝试在 F# 中构建第 n 次方函数。 (是的,.Net 中已经有 Math.Pow)。这是我的尝试:

let rec nthPower x n =
    match n with 
        | 0 -> 1
        | _ -> x * (nthPower x (n-1))

这在 n >= 0 时工作正常;但是,我不知道如何处理负面情况:当 n < 0 时。

问题:

  1. 如何处理负面案例? (n<0)

  2. 这个递归算法效率高吗?或者在 F# 中有什么有效的方法吗?

你可以这样实现:

let rec nthPower x n =
    match n with
      | 0 -> 1m
      | t when t < 0 -> 1m / (nthPower x -n)
      | _ -> decimal x * (nthPower x (n - 1));;

t when t < 0 允许模式匹配匹配一个范围的值。我会说这一行的 RHS 是不言自明的,但如果不清楚请告诉我。

关于问题 #2,我不认为这种方法有什么特别低效的地方,而且可能没有更简单的方法可以做到这一点。我不确定最有效的方法是什么,但希望一些数学家可以插话。

编辑: 我发现了一种对指数 > ~10 更有效的方法。它使用记忆和分而治之来计算 O(log n) 时间而不是 O(n) 的结果:

let rec nthPower x n =
    match n with
      | 0 -> 1.0
      | 1 -> double x
      | t when t < 0 -> 1.0 / (nthPower x -n)
      | _ ->
          let p = nthPower x (n / 2)
          p * p * nthPower x (n % 2)