【问题标题】:SquareRoot using recursive使用递归的平方根
【发布时间】:2014-05-02 18:34:45
【问题描述】:

我现在讨厌递归。任何人都知道如何在 python 上使用递归解决方案找到平方根。或者至少将其分解为简单的问题。我发现的所有示例都是线性的,仅使用函数中的一个参数。我的函数需要平方根(数字,低猜测,高猜测,准确性)我认为准确性应该是基本情况,但我无法弄清楚递归部分。

这是我尝试过的:

L = 1
H = 3
def s(n,L,H):
    if (((L + H)/2)**2) <= 0.05:
        print(((L + H)/2))
    else:
        if (((L + H)/2)**2) > 2:
            L = (L + H)/2
            return s(n,L,H)
        else:
            H = (L + H)/2
            return s(n,J,H)

【问题讨论】:

  • 一种方法可以解决所有问题?为什么不分解呢?看我的回答。

标签: python recursion square-root


【解决方案1】:
def sqrt(val):
    accuracy = 0.1
    s = 1.0
    while True:
        prevS = s
        s = (s + val/s) / 2
        if abs(s-prevS)  <= accuracy :
            return s

没有测试过..

编辑: 更好的版本

import math

def guess(val):
   if val > 1:
       return 10**(len(val)/2)
   elif val == 1
       return 1
   else
       return 1 # still thinking on this.. thought log10 would be best fit but that kills purpose of iterator      

def sqrt(val):
    accuracy = 0.1
    s = guess(val) # to reduce no of loops
    while True:
        prevS = s
        s = (s + val/s) / 2
        if abs(s-prevS)  <= accuracy :
            return s

【讨论】:

  • 感谢您如此迅速地回复。无论如何,我不再讨厌递归了,我只是有点沮丧。
【解决方案2】:
def sqroot(n,guessed=1.0):

if abs(guessed**2 - n) <= 1e-15 or n == 1:
    return guessed
else:
    guessed = (guessed+ (n/guessed))/2
    return sqroot(n,guessed)

【讨论】:

    【解决方案3】:

    不!这个是 Ruby 的。对不起!但是你可以很容易地适应它。这是一个简单的版本。 也许可以将其分解为更多方法。

    例如:

    平均

    正方形

    猜猜就够了

    改进猜测

    def sqrt(x)
      eps = 1.0e-17 # the epsilon desired
      diff = 1      # difference of new guess and result
      g = 1         # the guess
      while (diff > eps) do
        xg = x/g
        g1 = (g + xg)/2.0
        diff = (g - g1).abs
        g = g1
      end
      g
    end
    
    p sqrt 2 #=> 1.414213562373095 
    p Math.sqrt 2 #=> 1.4142135623730951
    
    def good_enough(x, guess)
      eps = 1.0e-17
      guess2 = square(guess) 
      (guess2 - x).abs < eps
      # true or false
    end
    
    def average(x, y)
      (x + y) / 2.0
    end
    
    and so on.....
    

    这只是一个例子。 尽可能抽象,以便以后使用。

    顺便问一下,你是不是碰巧在做 MIT OCW?

    我正在开发 CS 6.001,但这是计划。它从这种类型的处理或程序开始。 Ruby 有 lambda。你能用 Python 做 lambdas 吗?

    现在我在这里告诉过你有关方案的尝试:

    (define (square x)
      (* x x))
    
    (define epsilon 0.00001)
    
    (define close_enuf? 
      (lambda (guess x)
        (< (abs (- (square guess) x)) epsilon)))
    
    (define (average x y)
      (/ (+ x y) 2.0))
    
    (define improve 
      (lambda (guess x)
        (average guess (/ x guess))))
    
    (define sqrt_loop
      (lambda (guess x)
        (if (close_enuf? guess x)
          guess
          (sqrt_loop (improve guess x) x))))
    
    (define sqrt
      (lambda (x)
        (sqrt_loop 1.0 x)))
    

    读起来不会太难吧?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多