2014-08-28 62 views
1

如果我需要中途放弃递归子程序,我该怎么办?在中间中止递归子程序

  1. 引发异常并在递归子程序之外捕获它。

  2. 将递归布尔参数Exit_Right_Now添加到递归子程序中,这会使其从递归的第N级向外遍历到外部调用子程序。

  3. 停止使用显式递归并重写我的算法而不递归。

以上哪些变体是可行的,哪些不是?

请注意,我使用Ada编程语言编写。由于Ada RM允许有关异常的一些优化,我不太确定异常是否会做正确的事情,而不是“取消”在异常引发之前的某些操作。阿达会做正确的事情吗?

+2

选项2工作得很好,虽然有一个体面的编译器选项1应该更快,除了更容易。只有在堆栈空间可能成为问题时,我才会考虑选项3。 – 2014-08-28 19:28:28

+1

关于你最后的问题,我不认为优化会导致问题。 11.6中与异常有关的优化实际上只是涉及_language定义的checks_的权限,并不会影响你'raise'的异常。在递归子程序的每次调用中,需要最终确定的对象都将最终确定。如果您有任何关于优化效果的特定代码,请将其作为单独问题发布。 – ajb 2014-08-29 04:32:24

+2

有一种情况,虽然引发异常可能没有预期的效果:“out”参数,通常在子程序的退出时设置。因此,举例来说,如果您将A作为out参数,将其设置为1,然后引发异常,则调用者可能实际上看不到实际参数中的值1。 – manuBriot 2014-08-29 08:01:46

回答

2

对Ada没有任何具体的知识,显然所有的方法都可能工作得很好;然而,3.可能会导致更难以理解的实现。为了评估1和2,我可能会感兴趣的是,执行是否中止的情况更多的是用例或错误情况。如果递归中的提前终止是“正常情况下预期的”执行流程,那么可以将异常视为滥用语言功能。