我正在开发一个每 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 中依赖什么?
我已经注释掉了代码中不必要的、不执行任何操作的行:
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
函数调用自身。