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

Python无报错无警告时print不输出 勒让德多项式代码问题排查

问题原因

代码运行卡住无输出、p≥3时不出结果,核心是两个问题:

  • 第一是Python闭包的晚绑定特性导致的逻辑bug:你在for循环里用lambda定义多项式函数时,没有在定义瞬间捕获当前循环的i值,lambda执行时才会去查找i的取值。等循环跑完,i的值就是你输入的阶数p,所有索引≥2的lambda里引用的i全是p,调用时会触发无限递归:比如p=4时,arr[4]调用arr[3],但arr[3]里的i也是4,执行逻辑就变成调用arr[4-1]也就是arr[3]自己,函数永远递归调用自身,你又把递归深度上限设到了10000,短时间内碰不到递归深度报错,看起来就像程序卡死没反应。
  • 第二是勒让德多项式的递推公式写错了,就算闭包问题修复,计算结果也不对。标准递推式为:$nP_n(x) = (2n-1)xP_{n-1}(x) - (n-1)P_{n-2}(x)$,你原来写的系数完全错误。
  • 额外提一句:你导入的scipy.integrate全程没有使用,可以删掉,不需要额外依赖。
修复方案

解决闭包晚绑定最简单的方式是给lambda加默认参数,在函数定义的瞬间就把当前循环的n值、前两阶多项式的引用固定住,同时修正递推公式的系数即可。

修复后可运行代码
import sys
sys.setrecursionlimit(10000)

p = int(input("p="))
arr = [0] * (p + 1)
a = [0] * (p + 1)

arr[0] = lambda x: 1
a[0] = arr[0](0)
if p >= 1:
    arr[1] = lambda x: x
    a[1] = arr[1](0)

for i in range(2, p + 1):
    # 默认参数在定义时赋值,固定当前阶数i、前两阶多项式的引用
    arr[i] = lambda x, n=i, prev=arr[i-1], prev2=arr[i-2]: (
        ((2 * n - 1) * x * prev(x)) - (n - 1) * prev2(x)
    ) / n
    a[i] = arr[i](0)

print(a[p])
结果验证
  • 输入p=2,$P_2(x)=(3x^2-1)/2$,x=0时输出-0.5,结果正确
  • 输入p=3,$P_3(x)=(5x^3-3x)/2$,x=0时输出0.0,结果正确
  • 输入p=4,$P_4(x)=(35x4-30x2+3)/8$,x=0时输出0.375,结果正确
  • 任意阶数输入都不会再出现卡住无输出的问题。

内容的提问来源于stack exchange,提问作者Zsombor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:48:21