Python多项式求值函数编写求助:索引递增逻辑问题
我来帮你梳理一下问题所在,再给出几种靠谱的实现方式~
你的两种写法的问题分析
第一种代码:
你写的循环其实完全没起到作用——不管数组L里有多少个元素,每次循环都固定计算L[0]*x^0 + L[1]*x^1 + L[2]*x^2,如果数组长度不是3,直接会触发索引越界错误。而且循环遍历每个i的时候,每次都覆盖P的值,但因为表达式是固定的,最后返回的结果和循环次数无关,只是刚好你的测试用例L=[0,2,4]长度是3,才蒙对了结果,这纯属巧合。第二种代码:
这里的问题更明显:- 每次进入循环都把
j重置为0,导致j永远不会递增; sum(i * (x ** j))里的参数是单个数值,sum函数在这里完全多余;- 每次循环都只计算当前
i乘以x^0,最后P会被覆盖成最后一个元素的值,比如你的测试用例里最后会返回4,完全不符合预期。
- 每次进入循环都把
正确的实现方式
方式1:用enumerate自动匹配次数(直观易读)
enumerate可以同时拿到系数和对应的次数(数组的索引就是次数,因为第一个元素是x^0的系数,第二个是x^1的,以此类推),然后累加每个项的值即可:
def pol(L, x): result = 0 for power, coeff in enumerate(L): result += coeff * (x ** power) return result # 测试你的例子 L = [0, 2, 4] x = 3 print(pol(L, x)) # 输出 0*3^0 + 2*3^1 +4*3^2 = 0+6+36=42
方式2:霍纳法则(高效优化版)
对于多项式a₀ + a₁x + a₂x² + ... + aₙxⁿ,可以改写成((...((aₙx) + aₙ₋₁)x + ... )x) + a₀,这样能大幅减少乘法运算的次数,效率更高,尤其是当多项式次数很高的时候:
def pol(L, x): result = 0 # 从最高次系数开始遍历 for coeff in reversed(L): result = result * x + coeff return result # 测试例子 L = [0, 2, 4] x = 3 # 计算过程:4*3 +2 =14,14*3 +0=42 print(pol(L, x)) # 输出42
这两种方式都能完美解决你手动维护索引的问题,第一种适合理解逻辑,第二种适合追求性能的场景。
内容的提问来源于stack exchange,提问作者bryan tetris
相关产品推荐
相关产品推荐

