我在操场上有这个代码。我使用排序从切片/数组中获取最大值和最小值。当我需要以x个周期的间隔获取值时,问题就开始了。如果你运行代码,你将在最后一次打印有一个值1.0407,但是x周期之前不再有这个值,这个值离x的周期很远。所以我的问题是,他为什么偷看这个值?而min没有。package mainimport ( "fmt" "math" "sort")func main() { var period = 5 var highest float64 var lowest float64 for i, v := range x { if i < period { continue } var correctHighest, correctLowest = MaxMin(x[i-period : i]) fmt.Println("Correct -", "Price:", v, "Highest:", correctHighest, "Lowest:", correctLowest) } for i, v := range x { if i < period { continue } var correctHighest, correctLowest = MaxMin(x[i-period : i]) fmt.Println("Correct -", "Highest:", correctHighest, "Lowest:", correctLowest) highest = Max(x[i-period : i]...) lowest = Min(x[i-period : i]...) fmt.Println("Price:", v, "Highest:", highest, "Lowest:", lowest) }}// Both does not workfunc Max(n ...float64) float64 { sort.Float64s(n) if len(n) == 0 { return 0. } return n[len(n)-1]}func Min(n ...float64) float64 { sort.Float64s(n) if len(n) == 0 { return 0. } return n[0]}// New code that worksfunc MaxMin(n []float64) (float64, float64) { if len(n) == 0 { return 0., 0. } var max float64 var min = math.MaxFloat64 for _, value := range n { if value > max { max = value } if value < min { min = value } } return max, min}去
1 回答
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
发生的情况是,切片是对后备数组的引用,排序会就地对切片进行排序。这意味着对排序的调用。Float64s实际上是在修改(排序)x切片的内容(更准确地说,是x的子切片,但支持数组是相同的)。
正如我在上面的评论中提到的,仅仅使用排序来查找最小值/最大值不是一个好主意,因为它会比扫描最小值/最大值的简单循环慢。但是,如果您真的想使用它,则需要在将这些切片进行排序之前制作这些切片的深层副本。漂浮64s。
关于上述代码的小注意事项:如果所有元素都是负数,或者如果它们都是NaN,则您的MaxMin函数并不是真正正确的。您可能希望执行类似操作:https://godbolt.org/z/E5e5q7ePa(未经过测试)。
func MinMax(n []float64) (min float64, max float64) {
min, max = math.NaN(), math.NaN()
for _, e := range n {
if e < min || (math.IsNaN(min) && !math.IsNaN(e)) {
min = e
}
if e > max || (math.IsNaN(max) && !math.IsNaN(e)) {
max = e
}
}
return
}
- 1 回答
- 0 关注
- 77 浏览
添加回答
举报
0/150
提交
取消