使用SymPy实现的递归牛顿法函数返回None值问题排查
问题原因分析
你的牛顿法递归函数返回None的核心问题出在递归调用的返回值传递上,我们一步步拆解来看:
- 当递归进入终止条件(
Abs(approx - guess) < 0.001)时,确实会执行return approx返回正确的浮点数结果; - 但在
else分支中,你只是调用了newtons_method(approx),却没有把这个递归调用的返回值传递给上层函数。也就是说,除了最底层的递归调用返回了有效结果,上层的所有递归调用都没有明确返回值——Python中函数如果没有return语句,默认返回None; - 最终你顶层调用
newtons_method(1)时,拿到的是上层递归调用返回的None,而不是最底层返回的正确结果。
修复方案
只需要在else分支的递归调用前加上return,让递归的返回值逐层传递回去即可:
from sympy import * x = Symbol('x') f = (2*x) + 1 fprime = f.diff() f = lambdify(x, f) fprime = lambdify(x, fprime) newtons_expr = lambdify(x, x - (f(x) / fprime(x)) ) def newtons_method(guess): approx = newtons_expr(guess) if Abs(approx - guess) < 0.001: print(approx) print(type(approx)) return approx else: # 加上return,把递归调用的结果传递回去 return newtons_method(approx) print(newtons_method(1)) # 现在会输出-0.5,而不是None
额外小提示
其实你这个例子里的函数f(x)=2x+1是线性函数,牛顿法一次迭代就能找到根,不过这个递归逻辑的问题是通用的——所有递归函数都要确保每一层调用的返回值能正确传递到顶层,否则就会出现返回None的情况。
内容的提问来源于stack exchange,提问作者user8652048
相关产品推荐
相关产品推荐

