正则试位法(Regular False Position)递归Python程序运行无输出问题求助
正则试位法递归代码漏洞排查及修复
存在的核心问题
- 试位法计算公式错误
processinterval函数中求近似根c的公式完全写错,正则试位法的正确公式为c = (a * f(b) - b * f(a)) / (f(b) - f(a)),原代码分子错误写为a*f(a) - b*f(a),导致计算出的midpoint完全不符合预期,递归无法收敛。 - 递归终止条件顺序错误
原代码优先判断区间缩放逻辑,最后才判断精度收敛条件,只要f(a)*f(midpoint)不恰好等于0,程序会永远进入递归分支,永远触发不了精度判断的返回逻辑,最终要么递归栈溢出要么卡死无输出。 - 冗余代码问题
checkroot函数调用了falsepositionmethod但无返回也无打印,属于无效调用,不影响核心逻辑但冗余。
代码中的<是HTML转义字符,实际运行时要替换为<。
修复后的代码
import numpy as np import sys sys.setrecursionlimit(10000) def function(x): return float((1/x) - (np.log(x)) + (np.log(2))) def checkroot(a, b): # 增加返回值,判断区间是否存在根 return function(a) * function(b) < 0 def processinterval(a, b): # 修正试位法计算公式 c = float((a * function(b) - b * function(a)) / (function(b) - function(a))) return c def falsepositionmethod(a, b): midpoint = processinterval(a, b) # 先判断是否满足精度要求,满足直接返回,作为递归终止条件 if np.abs(function(midpoint)) < 0.0005: return midpoint # 再判断区间缩放逻辑 if function(a) * function(midpoint) < 0: return falsepositionmethod(a, midpoint) else: return falsepositionmethod(midpoint, b) def main(): a = 0.1 b = 20.0 if not checkroot(a, b): print("当前区间内不存在根或存在偶数个根,请调整区间") return root = falsepositionmethod(a, b) print(f"求得的根为:{root},对应函数值为:{function(root)}") main()
运行说明
修复后运行代码会输出近似根结果,精度满足设置的0.0005阈值要求,不会再出现无输出卡死的情况。
内容的提问来源于stack exchange,提问作者Weightlifting Without Limits
相关产品推荐
相关产品推荐

