我试图在F#中构建第n个幂函数。 (是的,.Net中已经Math.Pow
了。这是我的尝试:
let rec nthPower x n =
match n with
| 0 -> 1
| _ -> x * (nthPower x (n-1))
n >= 0
时效果很好;但是,我不知道如何处理否定的情况:当n< 0.
问题:
如何处理否定案例? (N小于0)
这种递归算法有效吗?或者F#中有什么有效的方法吗?
答案 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)