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
相关产品推荐
相关产品推荐

