猿问

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

以下代码中没有错误。


package main


import (

    "fmt"

    "math"

)


type ErrNegativeSqrt float64


func (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

}

为什么会有不同?


RISEBY
浏览 213回答 1
1回答

一只名叫tom的猫

由于逻辑有缺陷,第二个循环将是无限的。在这段代码中:for {&nbsp; &nbsp; n := z - (z*z - x) / (2*z)&nbsp; &nbsp; if math.Abs(n - z) < delta {&nbsp; &nbsp; &nbsp; &nbsp; z = n // here ....&nbsp; &nbsp; &nbsp; &nbsp; break // break here&nbsp; &nbsp; }}的值z从不更新为新计算的值。这导致n := z - (z*z - x) / (2*z)总是在相同的 上工作z,即等于x,因为条件math.Abs(n - z) < delta永远不会为真。您需要z再次分配给以便更新。z您可以通过在循环中记录值来检查这一点。示例代码: https: //play.golang.org/p/9H7Uze4gip
随时随地看视频慕课网APP

相关分类

Go
我要回答