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

递归实现的二分法求根算法无法正常运行,求问题排查

二分法代码问题排查及修复

存在的问题

  • 缺少numpy依赖导入:代码中使用了np开头的numpy方法,但没有导入numpy库
  • 递归逻辑完全错误:原代码中判断符号时,计算的是中点函数值 * 中点函数值(因为processinterval(a,b)返回的就是中点intervalmidpoint),二者乘积永远非负,完全不符合二分法判断区间端点符号的逻辑
  • 没有设置递归终止条件:传入的accuracy参数全程未被使用,递归不会主动停止,会触发栈溢出错误
  • 无返回值传递:findroot函数调用recursivefunction没有加return,recursivefunction内部递归调用自身也没有加return,即使得到正确根也无法返回结果
  • 边界判断缺失:仅判断了f(a)<0且f(b)>0的情况,没有处理函数值为0、符号相反的其他情况,也没有预先判断区间端点函数值是否异号的校验

修复后的可运行代码

import numpy as np

def calculatefunction2(c0):
    output = float(np.power(c0, 2) - np.log1p(1 + c0) - 30)
    return output

def processinterval(a, b):
    intervalmidpoint = (a + b) / 2
    return intervalmidpoint

def findroot(a, b, accuracy):
    # 先校验区间端点是否异号
    fa = calculatefunction2(a)
    fb = calculatefunction2(b)
    if fa * fb > 0:
        raise ValueError("区间两端点函数值同号,无法使用二分法求根")
    if fa == 0:
        return a
    if fb == 0:
        return b
    return recursivefunction(a, b, accuracy)

def recursivefunction(a, b, accuracy):
    # 终止条件:区间长度小于等于精度要求
    if b - a <= accuracy:
        return (a + b) / 2
    mid = processinterval(a, b)
    f_mid = calculatefunction2(mid)
    if f_mid == 0:
        return mid
    # 判断中点和左端点符号是否异号,异号则根在左半区间,否则在右半区间
    if f_mid * calculatefunction2(a) < 0:
        return recursivefunction(a, mid, accuracy)
    else:
        return recursivefunction(mid, b, accuracy)

def main():
    a = 4
    b = 6
    accuracy = 0.002
    root = findroot(a, b, accuracy)
    print(f"求得的根为:{root}")
    print(f"代入函数验证结果:{calculatefunction2(root)}")

main()

内容的提问来源于stack exchange,提问作者Weightlifting Without Limits

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:45:03