以下代码中没有错误。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 关注
- 212 浏览
添加回答
举报
0/150
提交
取消