【剑指offer】二分法求根号 [Go语言]

210 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

二分法求根号

解析

二分法是适合有序数组的。 直接写出过程:如果是求根号5的话

  1. 折半 5/2 = 2.5
  2. 平方进行校验 2.5*2.5=6.25 > 5 所以得到当前的上限2.5
  3. 再次折半 2.5/2 = 1.25
  4. 平方进行校验 1.25*1.25 = 1.5625 < 5,得到当前下限1.25
  5. 再次折半: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是值传递,我们要交换地址才能交换成功