【问题标题】:Newton Recursive Method for Square Root Problem in PythonPython中平方根问题的牛顿递归方法
【发布时间】:2020-09-11 04:40:02
【问题描述】:

对于 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

作为我的输出。

请帮忙。

【问题讨论】:

    标签: python recursion sqrt


    【解决方案1】:

    没有输出,因为您从未到达打印行:

    基本上,你有:

    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, epsilon, count)  
             else:
                  print (count)  
                  return newx  
    

    这会给你:

    newton_sqrt(13, 0.000001, 0)
    23
    

    【讨论】:

      【解决方案2】:

      首先,让我们明确您的newton_sqrt() 函数不起作用。要么你试图检测递归深度来修复它,要么你不知道它已经坏了。

      一个有效的newton_sqrt() 将是:

      import sys
      
      def newton_sqrt(a, epsilon, 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, epsilon, new_x)  # (better) guess again
      
      print(newton_sqrt(13, 1e-06))
      

      一旦成功,使用全局变量count 检测递归深度就很简单了:

      import sys
      
      count = 0
      
      def newton_sqrt(a, epsilon, x=None):
          global count
      
          count += 1
      
          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, epsilon, new_x)  # (better) guess again
      
      print(newton_sqrt(13, 1e-06), count)
      

      输出

      > python3 test.py
      3.6055513629176015 5
      >
      

      其中3.6055513629176015 是 13 的平方根,5 是计算它所需的递归深度,误差小于1e-06

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 2015-08-22
        • 2018-04-09
        • 2014-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多