如何计算一个平方根
大部分语言中都有sqrt()函数 你知道是如何实现的吗
方法一:穷举法
不会算法,就要堆算力,哈哈哈哈😂
def square_brute_force(x):
i = 0
guess = 1
while (x - g * g) > 0.001:
guess += 0.01
i += 1
print(f'{i}: guess = {guess}')
x = eval(input())
square_brute_force(x)
方法二:二分法
今天的主题,二分法,其主要思想是分而治之。在每一步的目标是将当前的问题分解为易于处理的子问题,并且尽量降低所有子问题的整体复杂度。
def binary_search(x):
i = 0
left = 0
right = x
guess = (left + right) / 2.0
while abs(guess * guess - x) > 0.001:
if guess * guess < x:
left = guess
else:
right = guess
guess = (left + right) / 2
i += 1
print(f'{i}: guess = {guess})
x = eval(input())
binary_search(x)
亲测,比前面快
方法三:牛顿迭代公式(真神)
什么计算都是浮云,还得是算法牛🐮,才是真的牛🐮,省事省时间,佩服大佬每一天,膜拜牛顿。 简单介绍一下:
def newton_iterantion(x):
i = 0
guess = x / 2
while abs(guess ** 2 - x) > 0.001:
guess = (guess + x / guess) / 2
i += 1
print(f'{i}: guess = {guess}')
x = eval(input())
newton_iteration(x)
不说了,建议大家都去试一试,在误差为小于0.001的条件下,同样计算sqrt(5),暴力法124次计算,二分法16次,牛顿法2次,没错是2次,惊讶!!
给大家终端展示一下
x = 5
-------------this is math_sqrt()----------------
y = sqrt(5) = 2.23606797749979
-------------this is brute_force----------------
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
-------------this is binary_search----------------
1: g = 1.250
2: g = 1.875
3: g = 2.188
4: g = 2.344
5: g = 2.266
6: g = 2.227
7: g = 2.246
8: g = 2.236
9: g = 2.231
10: g = 2.234
11: g = 2.235
12: g = 2.236
13: g = 2.236
14: g = 2.236
15: g = 2.236
16: g = 2.236
-------------this is newton_iteration----------------
1: g = 2.250
2: g = 2.236