You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SymPy实现的递归牛顿法函数返回None值问题排查

问题原因分析

你的牛顿法递归函数返回None的核心问题出在递归调用的返回值传递上,我们一步步拆解来看:

  1. 当递归进入终止条件(Abs(approx - guess) < 0.001)时,确实会执行return approx返回正确的浮点数结果;
  2. 但在else分支中,你只是调用了newtons_method(approx),却没有把这个递归调用的返回值传递给上层函数。也就是说,除了最底层的递归调用返回了有效结果,上层的所有递归调用都没有明确返回值——Python中函数如果没有return语句,默认返回None;
  3. 最终你顶层调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:04:53