Python平方根问题的牛顿递归方法

问题描述

对于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所需的递归深度。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...