我写了一个函数,以获得浮点数组的标准偏差,但我有一个问题,如果我有一个整数数组,我怎么能用它?
我不想为每种数据类型都有一个函数...
func StdDev(a []float64) float64 {
var Prom float64
sum := 0.0
Total := 0.0
n := len(a)
N := float64(n)
for i := 0; i < n; i++ {
sum += a[i]
}
Prom = sum / N
for i := 0; i < n; i++ {
Total += (a[i] - Prom) * (a[i] - Prom)
}
Total = Total / N
Total = math.Sqrt(Total)
return Total
}
Run Code Online (Sandbox Code Playgroud)
Go 没有泛型,因此您无法编写同时涵盖[]int和的解决方案。您必须使用简单的 for 循环和从 to的类型转换[]float64将值从to复制到 a 。然后你就可以使用你的功能了。示例(播放):[]int[]float64intfloat
a := []int{1,2,3,4}
b := make([]float64, len(a))
for i := range a {
b[i] = float64(a[i])
}
StdDev(b)
Run Code Online (Sandbox Code Playgroud)
您还可以做的是编写一个基于反射值的函数,然后使用reflect.MakeFunc. 这会更慢、更难制作并且需要编写更多代码,因此其好处是值得怀疑的。
虽然这是题外话,但我忍不住注意到,如果您在循环中使用范围子句,您的代码可能看起来会更好。此外,函数体中的变量以小写字母书写。还有一些其他语法技巧,例如命名返回值。利用 Go 的这些功能,您的代码可能看起来更好:
func Avg(a []float64) (sum float64) {
for i := range a {
sum += a[i]
}
return sum / float64(len(a))
}
func StdDev(a []float64) (total float64) {
prom := Avg(a)
for i := range a {
total += (a[i] - prom) * (a[i] - prom)
}
total = total / float64(len(a))
return math.Sqrt(total)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2447 次 |
| 最近记录: |