牛顿平方根近似算法无法返回结果?Python实现问题求助
问题分析与解决
嘿,我一眼就看到你踩了递归里的经典小坑——你的tryfor函数在递归调用时忘了返回结果!
咱们来拆解一下:当你的代码运行到else分支时,你调用了tryfor(improve(guess)),但这个调用的结果没有被返回给上一层函数。举个例子,当递归走到满足goodenough条件的那一步,它确实return guess了,但上层的tryfor只是执行了递归调用,却没把这个结果传递回去,所以最终整个tryfor(1)的调用就默认返回了None,这就是为什么你能看到正确的打印值,但函数返回None。
修正后的代码
只需要在递归调用前加上return就行了,另外我还顺手优化了goodenough函数的写法(原来的写法在条件不满足时会返回None,不够严谨):
def NewtonSqrt(x): def improve(guess): return (guess + (x/guess)) / 2 def goodenough(guess): # 直接返回布尔表达式,明确返回True/False return abs(guess - (x/guess)) < 0.00001 def tryfor(guess): if goodenough(guess): print(guess) return guess else: # 关键:把递归调用的结果返回出去 return tryfor(improve(guess)) return tryfor(1) print(NewtonSqrt(2))
为什么这样改?
递归函数的每一层都需要把结果传递回上一层,当你在else里写return tryfor(improve(guess))时,相当于告诉当前的tryfor函数:“我要把递归调用得到的结果作为我自己的返回值”。这样层层传递,最开始的tryfor(1)就能拿到最终的近似值,再由NewtonSqrt返回给调用者。
内容的提问来源于stack exchange,提问作者Anoni Moose
相关产品推荐
相关产品推荐

