Python 中的递归函数表现出不规则行为 - 它仅在某些时候执行

Recursive function in Python shows irregular behavior - it executes only sometimes

我正在处理一个涉及查找历史交易价格的问题。如果某个时间戳的价格不可用,请返回到之前的时间戳并查找该值。然而,在摆弄递归限制 sys.setrecursionlimit(limit) 后,我发现如果将限制设置得太高,代码的递归部分将不会完全执行。因此,我着手进一步调查这个问题。我写了一个函数来打印 Python 中的第 n 个 n_bonacci 系列。这是

的代码
import sys

sys.setrecursionlimit(10000)


def n_bonacci_series(n,  k=1, memo={}):
    if n in memo:
        return memo[n]
    elif n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        memo[n] = n_bonacci_series(n - 1, k,  memo) + \
            n_bonacci_series(n - 2, k, memo)
        return memo[n]


if __name__ == '__main__':
    n = n_bonacci_series(int(sys.argv[1]), int(sys.argv[2]), {})
    print(n)

它适用于较低的值 (1 - 2000)。但是,往高处不执行任何操作,终端什么也不输出。我把注意力集中在这个问题开始的数字上。以2206开头,当运行Python里的代码时,我发现它只会偶尔执行。输出附在下面。

@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
47560826085308642128638691782026383110062745693928884703260494102838475008504779896361090854101455457025401324143044776114166180160702554656438274920361681150989106875091171050407797787515069337246074248523724768358072059714670001942858736056802300373066705493637091637305975712573716191127269704968186479287183399647662677946469037303681204676246925752667295746028054079126466258038707553782482000197471467485598685351978786172553903287644120133460701701937983
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
47560826085308642128638691782026383110062745693928884703260494102838475008504779896361090854101455457025401324143044776114166180160702554656438274920361681150989106875091171050407797787515069337246074248523724768358072059714670001942858736056802300373066705493637091637305975712573716191127269704968186479287183399647662677946469037303681204676246925752667295746028054079126466258038707553782482000197471467485598685351978786172553903287644120133460701701937983
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
47560826085308642128638691782026383110062745693928884703260494102838475008504779896361090854101455457025401324143044776114166180160702554656438274920361681150989106875091171050407797787515069337246074248523724768358072059714670001942858736056802300373066705493637091637305975712573716191127269704968186479287183399647662677946469037303681204676246925752667295746028054079126466258038707553782482000197471467485598685351978786172553903287644120133460701701937983
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
47560826085308642128638691782026383110062745693928884703260494102838475008504779896361090854101455457025401324143044776114166180160702554656438274920361681150989106875091171050407797787515069337246074248523724768358072059714670001942858736056802300373066705493637091637305975712573716191127269704968186479287183399647662677946469037303681204676246925752667295746028054079126466258038707553782482000197471467485598685351978786172553903287644120133460701701937983
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
47560826085308642128638691782026383110062745693928884703260494102838475008504779896361090854101455457025401324143044776114166180160702554656438274920361681150989106875091171050407797787515069337246074248523724768358072059714670001942858736056802300373066705493637091637305975712573716191127269704968186479287183399647662677946469037303681204676246925752667295746028054079126466258038707553782482000197471467485598685351978786172553903287644120133460701701937983
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
47560826085308642128638691782026383110062745693928884703260494102838475008504779896361090854101455457025401324143044776114166180160702554656438274920361681150989106875091171050407797787515069337246074248523724768358072059714670001942858736056802300373066705493637091637305975712573716191127269704968186479287183399647662677946469037303681204676246925752667295746028054079126466258038707553782482000197471467485598685351978786172553903287644120133460701701937983
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
47560826085308642128638691782026383110062745693928884703260494102838475008504779896361090854101455457025401324143044776114166180160702554656438274920361681150989106875091171050407797787515069337246074248523724768358072059714670001942858736056802300373066705493637091637305975712573716191127269704968186479287183399647662677946469037303681204676246925752667295746028054079126466258038707553782482000197471467485598685351978786172553903287644120133460701701937983
@Animesh ➜ scripts python .\metallic_ratios.py 2206 5
@Animesh ➜ scripts

我正在使用 Python 3.9.7,我的处理器是 Intel Core i5 7200U,内存为 12 GB (2133Mhz)

我完全不明白为什么会这样。有人可以帮我调查这个问题吗?如果您是 运行 系统中的代码,请尝试使用 n 的值以获得不确定性,因为我认为这可能与系统配置有关。

您几乎可以肯定运行出栈space。递归在很大程度上取决于可用于存储先前条件的堆栈内存量。

thread 导入允许您更改堆栈的数量 space;我建议您尝试一下,然后 运行 您在新线程中的递归函数。