亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 238 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號