为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白猪掌柜的 2021-09-10 10:19:31
我在我的程序中导入了数学库,我试图通过以下方式找到三个数字中的最小值:v1[j+1] = math.Min(v1[j]+1, math.Min(v0[j+1]+1, v0[j]+cost))其中 v1 声明为:t := "stackoverflow"v1 := make([]int, len(t)+1)但是,当我运行我的程序时,出现以下错误:./levenshtein_distance.go:36: cannot use int(v0[j + 1] + 1) (type int) as type float64 in argument to math.Min我觉得这很奇怪,因为我有另一个程序可以编写fmt.Println(math.Min(2,3))并且该程序输出2没有抱怨。所以我最终将值转换为 float64,以便math.Min可以工作:v1[j+1] = math.Min(float64(v1[j]+1), math.Min(float64(v0[j+1]+1), float64(v0[j]+cost)))使用这种方法,我收到以下错误:./levenshtein_distance.go:36: cannot use math.Min(int(v1[j] + 1), math.Min(int(v0[j + 1] + 1), int(v0[j] + cost))) (type float64) as type int in assignment所以为了摆脱这个问题,我只是将结果投回 int我认为这是非常低效且难以阅读的:v1[j+1] = int(math.Min(float64(v1[j]+1), math.Min(float64(v0[j+1]+1), float64(v0[j]+cost))))我还写了一个小minInt函数,但我认为这应该是不必要的,因为其他程序math.Min在取整数时可以很好地利用工作,所以我得出结论,这一定是我的程序的问题,而不是库本身的问题。有什么我做错了吗?这是一个程序,您可以使用它来重现上述问题,特别是第 36 行:package mainimport (    "math")func main() {    LevenshteinDistance("stackoverflow", "stackexchange")}func LevenshteinDistance(s string, t string) int {    if s == t {        return 0    }    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 < len(v0); i++ {        v0[i] = i    }    for i := 0; i < len(s); i++ {        v1[0] = i + 1        for j := 0; j < len(t); j++ {            cost := 0            if s[i] != t[j] {                cost = 1            }            v1[j+1] = int(math.Min(float64(v1[j]+1), math.Min(float64(v0[j+1]+1), float64(v0[j]+cost))))        }        for j := 0; j < len(v0); j++ {            v0[j] = v1[j]        }    }    return v1[len(t)]}
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

不,我认为写这样的东西很好:例如,stdlib 的 sort.go在文件顶部附近执行它:


func min(a, b int) int {

    if a < b {

        return a

    }

    return b

}

math.Min(2, 3)碰巧起作用,因为Go 中的数字常量是 untyped。但是,请注意通常将 float64s 视为通用数字类型,因为如果转换为 float64,上面的整数2^53将被四舍五入。


查看完整回答
反对 回复 2021-09-10
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

整数没有内置的 min 或 max 函数,但编写自己的函数很简单。由于支持可变参数函数,我们甚至可以通过一次调用来比较更多的整数:


func MinOf(vars ...int) int {

    min := vars[0]


    for _, i := range vars {

        if min > i {

            min = i

        }

    }


    return min

}

用法:


MinOf(3, 9, 6, 2)

同样,这里是 max 函数:


func MaxOf(vars ...int) int {

    max := vars[0]


    for _, i := range vars {

        if max < i {

            max = i

        }

    }


    return max

}


查看完整回答
反对 回复 2021-09-10
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

例如,


package main


import "fmt"


func min(x, y int) int {

    if x < y {

        return x

    }

    return y

}


func main() {

    t := "stackoverflow"

    v0 := make([]int, len(t)+1)

    v1 := make([]int, len(t)+1)

    cost := 1

    j := 0


    v1[j+1] = min(v1[j]+1, min(v0[j+1]+1, v0[j]+cost))


    fmt.Println(v1[j+1])

}

输出:


1


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 415 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信