Created
July 18, 2018 08:47
-
-
Save ifreesec/a994a763ae52ecf3d77cb270e291d5a1 to your computer and use it in GitHub Desktop.
go 语言之旅——练习:循环与函数,的一种解法
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
https://tour.go-zh.org/flowcontrol/8 | |
为了练习函数与循环,我们来实现一个平方根函数:用牛顿法实现平方根函数。 | |
计算机通常使用循环来计算 x 的平方根。从某个猜测的值 z 开始,我们可以根据 z² 与 x 的近似度来调整 z,产生一个更好的猜测: | |
z -= (z*z - x) / (2*z) | |
重复调整的过程,猜测的结果会越来越精确,得到的答案也会尽可能接近实际的平方根。 | |
在提供的 func Sqrt 中实现它。无论输入是什么,对 z 的一个恰当的猜测为 1。 要开始,请重复计算 10 次并随之打印每次的 z 值。观察对于不同的值 x(1、2、3 ...), 你得到的答案是如何逼近结果的,猜测提升的速度有多快。 | |
提示:用类型转换或浮点数语法来声明并初始化一个浮点数值: | |
z := 1.0 | |
z := float64(1) | |
然后,修改循环条件,使得当值停止改变(或改变非常小)的时候退出循环。观察迭代次数大于还是小于 10。 尝试改变 z 的初始猜测,如 x 或 x/2。你的函数结果与标准库中的 math.Sqrt 接近吗? | |
(注:如果你对该算法的细节感兴趣,上面的 z² − x 是 z² 到它所要到达的值(即 x)的距离,除以的 2z 为 z² 的导数,我们通过 z² 的变化速度来改变 z 的调整量。这种通用方法叫做牛顿法。它对很多函数,特别是平方根而言非常有效。) | |
*/ | |
package main | |
import ( | |
"fmt" | |
"strconv" | |
"math" | |
) | |
func Sqrt(x float64) float64 { | |
z := x; | |
for i:=0; i < 10; i++ { | |
zOLd := strconv.FormatFloat(z, 'f', -1, 32) | |
z -= (z*z - x) / (2*z) | |
fmt.Println(z, math.Sqrt(x)) | |
if zOLd == strconv.FormatFloat(z, 'f', -1, 32) { | |
break; | |
} | |
} | |
return z; | |
} | |
func main() { | |
fmt.Println(Sqrt(3)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment