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

go,for循环和break,无限循环

go,for循环和break,无限循环

Go
RISEBY 2022-03-02 13:35:54
以下代码中没有错误。package mainimport (    "fmt"    "math")type ErrNegativeSqrt float64func (e ErrNegativeSqrt) Error() string {    return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))}func Sqrt(x float64) (float64, error) {    if x < 0 {        err := ErrNegativeSqrt(x)        return x, err    }    z := x    var delta = 1e-10    for {        n := z - (z*z - x) / (2*z)        if math.Abs(n - z) < delta {            break        }        z = n    }    return z, nil}func main() {    fmt.Println(Sqrt(2))    fmt.Println(Sqrt(-3))}但是当我更改 for 循环时func Sqrt(),它会导致无限循环吗?func Sqrt(x float64) (float64, error) {    if x < 0 {        err := ErrNegativeSqrt(x)        return x, err    }    z := x    var delta = 1e-10    for {        n := z - (z*z - x) / (2*z)        if math.Abs(n - z) < delta {            z = n // here ....            break // break here        }    }    return z, nil}为什么会有不同?
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

由于逻辑有缺陷,第二个循环将是无限的。在这段代码中:


for {

    n := z - (z*z - x) / (2*z)

    if math.Abs(n - z) < delta {

        z = n // here ....

        break // break here

    }

}

的值z从不更新为新计算的值。这导致n := z - (z*z - x) / (2*z)总是在相同的 上工作z,即等于x,因为条件math.Abs(n - z) < delta永远不会为真。


您需要z再次分配给以便更新。z您可以通过在循环中记录值来检查这一点。示例代码: https: //play.golang.org/p/9H7Uze4gip


查看完整回答
反对 回复 2022-03-02
  • 1 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

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