在 Go 中找到两个整数之间的最小值的正确方法是什么?
技术问答
573 人阅读
|
0 人回复
|
2023-09-11
|
我在我的程序中导入了数学库,我试图在三个数字中找到最小值:) Q( U' O- c: |5 X: y& T
v1[j 1] = math.Min(v1[j] 1,math.Min(v0[j 1] 1,v0[j] cost))其中 v1 声明为:
! a3 g3 k) t$ y1 v9 ^7 Mt := "stackoverflow"v1 := make([]int,len(t) 1)+ I$ E' J! @3 H% c, I) K# v' t# S8 V
但是,当我操作我的程序时,有以下错误:* w3 L" E) k7 B+ R( P/ R
./levenshtein_distance.go:36: cannot use int(v0[j 1] 1(type int) as type float64 in argument to math.Min/ [+ b0 s1 h* v/ @& n) q" t
我觉得很奇怪,因为我有另一个程序可以写
3 u7 {% P$ B% u! }5 I$ V* xfmt.Println(math.Min(2,3))程序输出2没有抱怨。% f; B" G8 H9 X$ e! |
所以我最终把值变成了 float64,这样就math.Min可以了:
" Y8 u3 l. j6 c% T8 N9 t" q1 b. ov1[j 1] = math.Min(float64(v1[j] 1),math.Min(float64(v0[j 1] 1),float64(v0[j] cost))): w+ m$ j+ o$ b* a* X# ?' m
用这种方法,我收到了以下错误:2 r% E( ]+ M( U8 r& m, z6 b- d# _
./levenshtein_distance.go:36: cannot use math.Min(int(v1[j] 1),math.Min(int(v0[j int(v0[j] cost))) (type float64) as type int in assignment
* y& B% J; q; g' V8 O1 f 所以为了摆脱这个问题,我只是把结果投回 int
( u5 y( d" U! \" R我觉得很低效,很难阅读:
4 j* R: h' l( _; Y/ g+ |v1[j 1] = int(math.Min(float64(v1[j] 1),math.Min(float64(v0[j 1] 1),float64(v0[j] cost))))
, J" V4 k# ^& q. D 我还写了一个小的minInt函数,但我认为这应该是不必要的,因为其他程序math.Min工作可以很好地利用整数,所以我得出结论,这一定是我的程序问题,而不是库本身。
1 B" X1 V8 N5 [, I" f( S+ U7 S我做错了什么吗?6 c: b0 g- ^' n8 m# b. o
这是一个可以重现上述问题的程序,特别是第 36 线:package main1 T5 H. m4 }( F3 m3 O# t9 ^ V2 j- `
[code]import "math")func main() LevenshteinDistance("stackoverflow","stackexchange")}func LevenshteinDistance(s string,t string) int if s == t return if len(s) == 0 return len(t) } if len(t) == 0 return len(s) } v0 := make([]int,len(t) 1) v1 := make([]int,len(t) 1) for i := 0; i 不,我觉得写这样的东西很好:例如,stdlib 的 sort.go在文件顶部附近执行:. z4 q) q/ ^ Z6 p" F
[code]func min(a,b int) int if a math.Min(2,3)碰巧起作用,因为Go 中的数字常量是无类型的。但是,请注意 float64s 被视为通用数字类型,因为如果转换为 float64,以上整数2^五三四舍五入。1 S9 @; F/ ]) [3 K3 L/ H7 B6 h) L
尽管在当我写这篇文章的时候不适用于稳定 Go,但在Go 1.18 beta 中,您可以编写一个通用min运行时,函数与手动编码的单一版本一样高效。& k* @3 p+ }0 ~! U/ \- Q- m
一直在讨论更新 stdlib 添加现有函数的通用版本,但如果发生这种情况,等待更高的版本。 |
|
|
|
|
|