回答

收藏

在 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 M
    t := "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. o
    v1[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 添加现有函数的通用版本,但如果发生这种情况,等待更高的版本。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则