Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
题目
二分法求根号
解析
二分法是适合有序数组的。 直接写出过程:如果是求根号5的话
- 折半 5/2 = 2.5
- 平方进行校验 2.5*2.5=6.25 > 5 所以得到当前的上限2.5
- 再次折半 2.5/2 = 1.25
- 平方进行校验 1.25*1.25 = 1.5625 < 5,得到当前下限1.25
- 再次折半:2.5-(2.5-1.25)/2=1.875 < 5 ,得到当前下限 1.875
AC Code
package main
import "fmt"
func main() {
ans := sqrt(3)
fmt.Println(ans)
}
func sqrt(num float64) float64 {
(1) if num == 1 {
return 1
}
var lower, curValue float64
(2) upper := num
if lower > upper {
(3) swap(&lower, &upper)
}
(4) for upper-lower > 0.0001 {
(5) curValue = lower + (upper-lower)/2
(6) if curValue*curValue < num {
(7) lower = curValue
} else {
(8) upper = curValue
}
}
return curValue
}
func swap(a,b *float64) {
(9) *a, *b = *b, *a
}
- (1) 如果当前的这个值是1的话,就直接返回,因为1开根号还是1
- (2) 定义一个最大值,因为开根号本质就是不断对中间进行逼近
- (3) 如果这个数是比lowwer小就进行交换
- (4) 我们这里设置一个误差,来确定左边界和右边界的误差在给定的小数范围内
- (5) 让当前的值等于左界限加上右界限减去左界限除以2的值。就可以了。
- (6) 如果当前校验起来比num小的话,就让左界限提前
- (7) 否则,就让右界限延后
- (8) 最后返回curValue的这个值就是我们所要求的根号值。
- (9) 注意要交换地址,因为这个string是值传递,我们要交换地址才能交换成功