回答

收藏

在 Go 中找到两个整数之间的最小值的正确方法是什么?

技术问答 技术问答 511 人阅读 | 0 人回复 | 2023-09-11

我在我的程序中导入了数学库,我试图在三个数字中找到最小值:
" E7 G( s4 O4 i/ }5 v* L8 }6 {v1[j 1] = math.Min(v1[j] 1,math.Min(v0[j 1] 1,v0[j] cost))其中 v1 声明为:
" R/ c: \. T" W, ~2 V! w0 M$ Z( C
    t := "stackoverflow"v1 := make([]int,len(t) 1)
    4 Z- ]8 i# t  N/ l$ R! Z6 A) v
但是,当我操作我的程序时,有以下错误:
7 T# O/ i+ R8 o5 i1 {" I4 e
    ./levenshtein_distance.go:36: cannot use int(v0[j  1]  1(type int) as type float64 in argument to math.Min- _0 O. o2 q  S; i2 E9 Z( D9 b
我觉得很奇怪,因为我有另一个程序可以写/ C6 `- I! f. g) B* [" U8 I
fmt.Println(math.Min(2,3))程序输出2没有抱怨。- C* I& r! @" N" j/ _! X+ D
所以我最终把值变成了 float64,这样就math.Min可以了:
: }6 O1 b6 L% j1 e/ v4 I1 j
    v1[j 1] = math.Min(float64(v1[j] 1),math.Min(float64(v0[j 1] 1),float64(v0[j] cost)))
    1 }1 _; B4 O  X" r3 O. b
用这种方法,我收到了以下错误:
. W1 x9 C; c; o$ {2 `
    ./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$ Q# X" W3 V9 h6 t/ q
所以为了摆脱这个问题,我只是把结果投回 int
) ]$ e% T  Y' d( R: X+ u8 V我觉得很低效,很难阅读:
: d7 v1 F+ Q% K1 j9 ~" a
    v1[j 1] = int(math.Min(float64(v1[j] 1),math.Min(float64(v0[j 1] 1),float64(v0[j] cost))))9 q- w! N  U. _7 I' i- x. u
我还写了一个小的minInt函数,但我认为这应该是不必要的,因为其他程序math.Min工作可以很好地利用整数,所以我得出结论,这一定是我的程序问题,而不是库本身。3 m' ?; N; W, {1 m4 z  Q9 ^
我做错了什么吗?
) Y; i; {1 m. h这是一个可以重现上述问题的程序,特别是第 36 线:package main
% x( _$ c; h  Q, V[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在文件顶部附近执行:
/ e( S+ m0 w" A9 [3 ^4 L[code]func min(a,b int) int    if a math.Min(2,3)碰巧起作用,因为Go 中的数字常量是无类型的。但是,请注意 float64s 被视为通用数字类型,因为如果转换为 float64,以上整数2^五三四舍五入。6 C7 R" `1 ^) n1 I5 O+ F( w2 A; d% q
尽管在当我写这篇文章的时候不适用于稳定 Go,但在Go 1.18 beta 中,您可以编写一个通用min运行时,函数与手动编码的单一版本一样高效。
* d; ~* O' B# F* \+ R一直在讨论更新 stdlib 添加现有函数的通用版本,但如果发生这种情况,等待更高的版本。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则