如何计算一个数的平方根? 大部分编程语言中都有一个类似 sqrt() 的函数。 sqrt()函数是如何实现的?
方法一:穷举法
穷举法的思想很简单,比如求 𝑥 的开方值 𝑔=√𝑥 。先从 𝑔=1 开始,然后 𝑔 值逐渐增加(步长),根据所需要的精度一步一步的去逼近真实的 √𝑥。
(𝑥−𝑔^2 )≤ 0.001
为了选取一个接近 √20 的数,可以从小到大去凑。比如 𝑔 从 1 开始: 1 的平方小于 20 。假设步长 1, 𝑔 值每次增加 1,2 的平方小于 20 , 3 的平方小于20 , 4 的平方小于 20 ,但是 5 的平方大于 20。 步长的选取一般取 0.01 或更小。
(1)假设从 1 开始逼近: 𝑔=1
(2)〖"比较 " 𝑔〗^2 和 𝑥 两者之差,当小于一个可允许的误差范围(0.001)内,说明 𝑔≈√𝑥 (𝑥−𝑔^2 )≤ 0.001
(3)如果不满足精度要求,𝑔=𝑔+0. 01 ,直到满足条件为止: (𝑥−𝑔^2 )≤ 0.001
def square_root(x):
i=0
g=1
while (x-g**2)>0.001:
g=g+0.01
i+=1
print("{}:g={:.3f}".format(i,g))
x=eval(input("x="))
square_root(x)
x=5 1:g=1.010 2:g=1.020 3:g=1.030 4:g=1.040 5:g=1.050 6:g=1.060 7:g=1.070 8:g=1.080 9:g=1.090 10:g=1.100 11:g=1.110 12:g=1.120 13:g=1.130 14:g=1.140 15:g=1.150 16:g=1.160 17:g=1.170 18:g=1.180 19:g=1.190 20:g=1.200 21:g=1.210 22:g=1.220 23:g=1.230 24:g=1.240 25:g=1.250 26:g=1.260 27:g=1.270 28:g=1.280 29:g=1.290 30:g=1.300 31:g=1.310 32:g=1.320 33:g=1.330 34:g=1.340 35:g=1.350 36:g=1.360 37:g=1.370 38:g=1.380 39:g=1.390 40:g=1.400 41:g=1.410 42:g=1.420 43:g=1.430 44:g=1.440 45:g=1.450 46:g=1.460 47:g=1.470 48:g=1.480 49:g=1.490 50:g=1.500 51:g=1.510 52:g=1.520 53:g=1.530 54:g=1.540 55:g=1.550 56:g=1.560 57:g=1.570 58:g=1.580 59:g=1.590 60:g=1.600 61:g=1.610 62:g=1.620 63:g=1.630 64:g=1.640 65:g=1.650 66:g=1.660 67:g=1.670 68:g=1.680 69:g=1.690 70:g=1.700 71:g=1.710 72:g=1.720 73:g=1.730 74:g=1.740 75:g=1.750 76:g=1.760 77:g=1.770 78:g=1.780 79:g=1.790 80:g=1.800 81:g=1.810 82:g=1.820 83:g=1.830 84:g=1.840 85:g=1.850 86:g=1.860 87:g=1.870 88:g=1.880 89:g=1.890 90:g=1.900 91:g=1.910 92:g=1.920 93:g=1.930 94:g=1.940 95:g=1.950 96:g=1.960 97:g=1.970 98:g=1.980 99:g=1.990 100:g=2.000 101:g=2.010 102:g=2.020 103:g=2.030 104:g=2.040 105:g=2.050 106:g=2.060 107:g=2.070 108:g=2.080 109:g=2.090 110:g=2.100 111:g=2.110 112:g=2.120 113:g=2.130 114:g=2.140 115:g=2.150 116:g=2.160 117:g=2.170 118:g=2.180 119:g=2.190 120:g=2.200 121:g=2.210 122:g=2.220 123:g=2.230 124:g=2.240
求5的平方根,计算了124次。 方法二:牛顿迭代法 而采用牛顿迭代法,只计算了2次。
牛顿迭代法(Newton-Raphson法)是一种用于求解非线性方程的数值方法。它利用函数的导数信息来逐步逼近方程的根。其基本思想是从一个初始猜测出发,通过迭代更新这个猜测,直到其收敛于真实根。
def square_root_3(x):
i = 0
g = x/2
while abs(g*g-x) > 0.001:
g = (g + x/g)/2
i = i + 1
print('{}: g = {:.3f}'.format(i,g))
x = eval(input('x = '))
square_root_3(x)
x = 5
1: g = 2.250
2: g = 2.236
解决同一个问题可以设计出不同的算法,算法之间的效率差别很大不是获得结果就结束了,而是要进一步分析不同算法之间对程序执行效率的影响,然后选择最好的算法针对一个问题,设计出高效的算法,而不单单是解决给定的一个问题算法设计就是程序设计中的一个核心内容,也是计算的美和魅力所在!