【问题标题】:Reason for "Maximum recursion error" in PythonPython中“最大递归错误”的原因
【发布时间】:2021-03-25 18:35:03
【问题描述】:

我编写了这个程序,描述了一种用于模拟偏微分方程的算法。我使用的基本函数由

定义
import numpy as np
import math
from scipy import integrate, stats


def shift(func, x, a=0):
    return func(x-a)


def scale(func, a=1):
    return a*func


def trunc(func, x):
    if x <= 0:
        return 0
    else:
        return func(x)


def quad(func, a, b):
    return integrate.quad(func, a, b)


def gauss(func, t, x):
    def pregau(z):
        k = (-t ** (1 / 2)) * z
        return shift(func, x, k)*math.exp(-(z**2)/2)

    fa = (1 / ((2 * math.pi) ** (1 / 2)) * integrate.quad(pregau, -np.inf, np.inf)[0])
    return fa

然后程序模拟偏微分方程的解

def vundl(x, u, l0=0.0, a=a, b=b, c=c):
    v = [u(x)]
    l = [l0]
    f_temp_rec = u
    for i in range(10):
        def f_temp(x):
            y = x - c * dt + B[i + 1] * 2 * a
            z = b * dt
            return gauss(f_temp_rec, z, y)

        li = l[i] + quad(f_temp, 0, np.inf)[0]
        l = np.append(l, li)

        if x <= 0:
            v = np.append(v, 0)
            f_temp_rec = 0

        else:
            f_temp_rec = f_temp
            v = np.append(v, f_temp(x))

    return [v, l]


def u0(x):
    return stats.beta.pdf(x, 2.7, 3.05)


print(vundl(x = 0.5, u0))

如果我在 N=0 时运行这个程序,它会产生一个向量。运行 N>0 的程序给我以下错误:

"RecursionError: 超出最大递归深度"

但它实际上应该给我一个向量 v 和一个向量 l。

【问题讨论】:

  • 在堆满之前你还没有到达函数的末尾。在堆内存用完之前,您可以在彼此之间进行最大次数的函数调用。

标签: python


【解决方案1】:

我不确定您在vundl 中使用f_tempf_temp_rec 到底要做什么,但在您分配的else: 块中:

f_temp_rec = f_temp

然后调用f_temp,后者调用gauss(f_temp_rec, z, y)。由于此时f_temp_rec is f_temp 函数f_temp 在无限递归中调用自身。

您应该能够在回溯中看到f_temp 反复调用自己。

【讨论】:

  • vundl 应该返回一个值在索引 0,....,N 处的数组,并且条目 i 的值取决于值 i-1。所以在f_temp 中,我首先使用 u0,然后我想在步骤 i 中使用步骤 i-1 的 f_temp。
  • 函数本身还是返回值?我真的不明白。
  • 无论如何,这就是你得到无限递归的原因。
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2018-09-30
  • 2017-08-24
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多