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

时间:2015-03-10 12:28:42

标签: 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#中有什么有效的方法吗?

1 个答案:

答案 0 :(得分:3)

您可以像这样实现:

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,我认为这种方法没有什么特别低效的方法,并且可能没有更简单的方法。我不确定最有效的方法是什么,但希望有些数学家可以加入。

修改:我发现了一种对指数更有效的方法&gt; 〜10。它使用memoization和divide-con-conquer来计算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)