使用巴比伦法计算平方根结果错误的问题求助
嘿,我看了你用巴比伦法写的平方根计算代码,输入100返回26确实离谱,咱们来一步步揪出问题所在:
先还原你的问题:
我感觉逻辑都对,但就是算不对平方根。每次运行结果都有问题,比如输入100,它返回26,这明显不对。我哪里做错了?
你的代码如下:
def sqrt(n): nextGuess = n / 2 lastGuess = 1 accuracy = 0.000001 while lastGuess > accuracy: x = (lastGuess + n / lastGuess) / 2 lastGuess = nextGuess - x nextGuess = x return x n = float(input('Enter a value:')) if n <= 0: print('Invalid number. Enter a positive number.') else: print(sqrt(n))
第一个致命问题:return 放错地方了!
你把return x直接写在while循环里面了,这意味着循环刚跑第一次就直接返回结果了——巴比伦法本来需要多次迭代慢慢收敛到正确值,你这直接掐断了迭代过程,结果能对才怪!
第二个大问题:迭代公式用错了变量
巴比伦法的核心是用当前的猜测值去算下一个更准的猜测值,公式是新猜测 = (旧猜测 + n/旧猜测)/2。但你第一次算x的时候,用的是初始值lastGuess=1,而不是你一开始设的nextGuess(也就是n/2),这直接让第一次计算就跑偏了——输入100的话,用1算出来的是(1+100)/2=50.5,不过你说返回26,应该是你写代码时把变量搞混了,要是误用nextGuess计算的话,(50+100/50)/2=26,这就是你得到错误结果的直接原因!
还有循环条件也错了
你写的while lastGuess > accuracy完全不合逻辑:你把lastGuess赋值成nextGuess - x,这个值可能是负数(比如第一次循环后是50-50.5=-0.5),-0.5肯定小于0.000001,循环直接就停了。正确的循环条件应该是判断两次猜测值的差的绝对值是否大于精度——也就是当新旧猜测的差距还比较大的时候,继续迭代。
给你修正后的代码
我把变量名改得更清晰,逻辑也理顺了:
def sqrt(n): # 初始猜测值设为n/2,这是巴比伦法常用的初始值 current_guess = n / 2 accuracy = 0.000001 while True: # 用当前猜测值计算下一个更准确的结果 next_guess = (current_guess + n / current_guess) / 2 # 检查是否达到精度要求:新旧猜测的差足够小 if abs(next_guess - current_guess) < accuracy: break # 更新当前猜测值,准备下一轮迭代 current_guess = next_guess return next_guess n = float(input('Enter a value:')) if n <= 0: print('Invalid number. Enter a positive number.') else: print(sqrt(n))
你再测试输入100,这个代码会返回接近10的结果(比如9.999999999999998),完全符合预期。
备注:内容来源于stack exchange,提问作者Qui333

