以下代碼中沒有錯誤。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
- 1 回答
- 0 關注
- 238 瀏覽
添加回答
舉報
0/150
提交
取消