使用递归计算平方根

-4 投票
2 回答
2910 浏览
提问于 2025-04-18 05:10

我现在真的很讨厌递归。有没有人知道怎么用递归的方法在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)

2 个回答

-1

不!这个是用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.....

这只是一个例子。 尽量把所有可以抽象的部分提取出来,这样你以后可以再用。

顺便问一下,你是在做麻省理工学院的开放课程吗?

我正在学习CS 6.001,但那是用Scheme语言。它一开始就涉及这种处理或过程。Ruby有lambda表达式。你能在Python中使用lambda吗?

现在我告诉你关于Scheme的内容,这里是我的尝试:

(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)))

读起来不太难吧?

-1
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)

这段代码是用来做某些操作的,但具体的功能和用途需要根据上下文来理解。一般来说,代码块里包含了一些指令或者命令,计算机会按照这些指令一步步执行。

如果你对代码的具体内容有疑问,可以查看相关的文档或者教程,那里会有更详细的解释和示例,帮助你更好地理解这段代码的作用。

记住,编程就像学习一种新的语言,刚开始可能会觉得有点难,但多练习就会慢慢上手的。

撰写回答