问题描述
对于a = 13和精确的epsilon = 10 ^ -7。您在newton_sqrt(13,10 ^ -7)中应用牛顿递归公式多少次?提示:使用全局变量。
我当前的newton_sqrt(a,epsilon)函数如下:
def newton_sqrt(a,epsilon):
global count
if a < 0:
print("Error: a < 0")
return -1
elif a == 0.0:
return 0
else:
x = abs(a)
newx = 0.5*(x + a/x)
if abs(x - newx) > epsilon:
newton_sqrt(newx,epsilon)
count = count + 1
if not abs(x-newx) > epsilon:
print (count)
return newx
newton_sqrt(13,0.000001)
无论出于什么原因,我都会得到
918488688 None
作为我的输出。
请帮助。
解决方法
没有输出,因为您从未到达打印行:
基本上,您有:
if x:
if not x:
print(something)
我想要的是:
if x:
#do something
else:
#do somthing else
不知道函数的数学运算,我将其更改为:
def newton_sqrt(a,epsilon,count):
if a < 0:
print("Error: a < 0")
return -1
elif a == 0.0:
return 0
else:
x = abs(a)
newx = 0.5*(x + a/x)
if abs(x - newx) > epsilon:
count = count + 1
newton_sqrt(newx,count)
else:
print (count)
return newx
这将为您提供:
newton_sqrt(13,0.000001,0)
23
,
首先,请清楚您的newton_sqrt()
函数不起作用。您正在尝试检测递归深度以解决此问题,或者您不知道它已损坏。
有效的newton_sqrt()
将遵循以下原则:
import sys
def newton_sqrt(a,x=None):
if a < 0:
print("Error: a < 0",file=sys.stderr)
return -1
if a == 0:
return 0
if x is None: # initial guess
x = a
new_x = (x + a / x) / 2 # refine guess
if abs(new_x * new_x - a) < epsilon: # test guess
return new_x
return newton_sqrt(a,new_x) # (better) guess again
print(newton_sqrt(13,1e-06))
一旦可行,使用全局变量count
检测递归深度很简单:
import sys
count = 0
def newton_sqrt(a,x=None):
global count
count += 1
if a < 0:
print("Error: a < 0",1e-06),count)
输出
> python3 test.py
3.6055513629176015 5
>
其中3.6055513629176015
是13的平方根,而5
是计算误差小于1e-06
所需的递归深度。