如何处理 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 时。
问题:
如何处理负面案例? (n<0)
这个递归算法效率高吗?或者在 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)
我正在尝试在 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# 中有什么有效的方法吗?
你可以这样实现:
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)