1
如果我需要中途放弃递归子程序,我该怎么办?在中间中止递归子程序
引发异常并在递归子程序之外捕获它。
将递归布尔参数Exit_Right_Now添加到递归子程序中,这会使其从递归的第N级向外遍历到外部调用子程序。
停止使用显式递归并重写我的算法而不递归。
以上哪些变体是可行的,哪些不是?
请注意,我使用Ada编程语言编写。由于Ada RM允许有关异常的一些优化,我不太确定异常是否会做正确的事情,而不是“取消”在异常引发之前的某些操作。阿达会做正确的事情吗?
选项2工作得很好,虽然有一个体面的编译器选项1应该更快,除了更容易。只有在堆栈空间可能成为问题时,我才会考虑选项3。 – 2014-08-28 19:28:28
关于你最后的问题,我不认为优化会导致问题。 11.6中与异常有关的优化实际上只是涉及_language定义的checks_的权限,并不会影响你'raise'的异常。在递归子程序的每次调用中,需要最终确定的对象都将最终确定。如果您有任何关于优化效果的特定代码,请将其作为单独问题发布。 – ajb 2014-08-29 04:32:24
有一种情况,虽然引发异常可能没有预期的效果:“out”参数,通常在子程序的退出时设置。因此,举例来说,如果您将A作为out参数,将其设置为1,然后引发异常,则调用者可能实际上看不到实际参数中的值1。 – manuBriot 2014-08-29 08:01:46