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

时间:2016-08-23 10:04:52

标签: go

以下代码中没有错误。

x_mean = Xdata.mean(axis=0) 
x_std = Xdata.std(axis=0) 
X = (Xdata-x_mean)/(x_std+0.00001)

但是当我在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()

为什么有不同?

1 个答案:

答案 0 :(得分:4)

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

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