使用递归计算平方根
我现在真的很讨厌递归。有没有人知道怎么用递归的方法在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)
这段代码是用来做某些操作的,但具体的功能和用途需要根据上下文来理解。一般来说,代码块里包含了一些指令或者命令,计算机会按照这些指令一步步执行。
如果你对代码的具体内容有疑问,可以查看相关的文档或者教程,那里会有更详细的解释和示例,帮助你更好地理解这段代码的作用。
记住,编程就像学习一种新的语言,刚开始可能会觉得有点难,但多练习就会慢慢上手的。