目录
练习一:循环和函数
题目:
作为练习函数和循环的简单途径,用牛顿法实现开方函数。
在这个例子中,牛顿法是通过选择一个初始点 z 然后重复这一过程求 Sqrt(x)
的近似值:
为了做到这个,只需要重复计算 10 次,并且观察不同的值(1,2,3,……)是如何逐步逼近结果的。 然后,修改循环条件,使得当值停止改变(或改变非常小)的时候退出循环。观察迭代次数是否变化。结果与 math.Sqrt 接近吗?
提示:定义并初始化一个浮点值,向其提供一个浮点语法或使用转换:
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"
import "math"
/*练习:循环与函数*/
func Sqrt(x float64) float64 {
var z float64 = 1.0
for i := 1; i <= 10; i++ {
z -= (z*z - x) / (2 * z)
fmt.Printf("step%d:%v\n", i, z)
}
return z
}
func main() {
fmt.Println(Sqrt(3))
fmt.Println(math.Sqrt(3))
}
运行结果
step1:2
step2:1.75
step3:1.7321428571428572
step4:1.7320508100147276
step5:1.7320508075688772
step6:1.7320508075688774
step7:1.7320508075688772
step8:1.7320508075688774
step9:1.7320508075688772
step10:1.7320508075688774
1.7320508075688774
1.7320508075688772
练习二:斐波纳契数列
斐波纳契闭包
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
a,b := 0,1
return func()int{
a, b = b, (a+b)
return a
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
运行结果
1
1
2
3
5
8
13
21
34
55
递归实现
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci(x int) int {
if x < 2{
return x
}else{
return fibonacci(x-1)+fibonacci(x-2)
}
}
func main() {
for i := 0; i < 10; i++ {
fmt.Println(fibonacci(i))
}
}
运行结果
0
1
1
2
3
5
8
13
21
34