如果我在 LibreOffice Basic 中使用 GoTo 创建递归,堆栈会溢出吗?

问题描述 投票:0回答:1

我正在开发一个每 30 毫秒执行一些操作的计时器。我想仅使用 LibreOffice Basic 来执行此操作。我尝试创建递归,但堆栈溢出。我也尝试过使用循环,但它们运行速度较慢,这甚至肉眼可见。然后我的研究主管找到了GoTo。使用GoTo,我想实现递归。我已经运行了这段代码,堆栈没有溢出,但我很好奇它是否会溢出,如果会溢出,什么时候会溢出?例如,嵌套递归可以执行大约 3-3.5k 次调用(我已经验证了这一点)。

Sub loopWork
GoTo Label1
Label1:
    if stateMainTimer = 2 Then
        Exit Sub
    endif   
    GoTo Label2
Label2:
    loopWorkVoid()
    GoTo label1
End Sub

该结构已支持超过 35,000 个呼叫。

我在没有 GoTo 的情况下运行递归,它在溢出之前最多可容纳大约 3,000-3,500 次调用。我添加了一个 for 循环,然后称为递归,该结构持续了大约 20,000 次调用。有了这个结构(GoTo),它已经保存了超过 75,000 个调用,我很好奇这个限制。

我想得到一个带有解释的答案,比如为什么递归在 3k 调用上会崩溃,但 GoTo 在 30k 上不会崩溃,甚至会陷入递归吗? GoTo 中依赖什么?

stack-overflow libreoffice-calc basic libreoffice-basic
1个回答
0
投票

我已经注释掉了代码中不必要的、不执行任何操作的行:

Sub loopWork
    'GoTo Label1
Label1:
    if stateMainTimer = 2 Then
        Exit Sub
    endif   
    'GoTo Label2
'Label2:
    loopWorkVoid()
    GoTo label1
End Sub

现在可以清楚地看到,这就是

while
循环。
while
循环比
for
循环运行得快一点,因为不需要计数器。无论你如何混淆它,
while
循环都不是递归。递归将是 if
loopWork
函数调用自身或
loopWorkVoid
函数调用自身。

© www.soinside.com 2019 - 2024. All rights reserved.