【问题标题】:Python Calling a raise exception instead of returning in recursive functionPython调用引发异常而不是在递归函数中返回
【发布时间】:2013-10-14 19:18:17
【问题描述】:

我必须检查我抛出异常以结束递归而不是返回的代码的运行速度有多快

我的返回代码是这样的:

    def factorial(self, n):
    if n==0:
        return 1
    else:
        return n* self.factorial(n-1)

现在我的代码带有 raise:

def factorial2(self, n):
    if n==0:
        raise Exc(1)
    else:
        return n* self.factorial2(n-1)

我不知道,它是否应该看起来像这样,我应该怎么做才能获得价值 我已经尝试过这样的事情

try:
    print factorial2(n)
except Exc:
    1

但它不起作用。我什至不知道我是否接近好的解决方案。

谁能帮帮我,给我一些建议?

【问题讨论】:

  • 如果你想衡量性能,抛出异常不是一个好主意。
  • 为什么不@第四只眼?
  • 我认为这就是她想要衡量的......两者之间的性能差异......(它只是退出递归的另一种方式......)他们之间的速度差异可能会非常小
  • 引发异常(除非您在factorial2 的每个实例中都捕获它)破坏了递归调用的目的。它可能更快,但也会出错,因为函数的正确性取决于 factorial2 返回成功后发生的乘法。
  • @JoranBeasley 引发异常时,不应该展开堆栈吗?

标签: python exception recursion


【解决方案1】:

你需要在这个函数的 else 部分使用 try/except ... 因为如果你在外面听,所有的调用最终都会引发这个异常,那么你所有的工作都会丢失

def factorial2(self, n):
    if n==0:
        raise Exc(1)
    else:
        try:
           return n* self.factorial2(n-1)
        except Exc:
           return n

【讨论】:

  • 非常感谢。我不知道为什么我什至没有想过把它放在一起。
猜你喜欢
  • 2017-10-16
  • 1970-01-01
  • 2016-06-30
  • 2022-07-21
  • 2022-01-23
  • 2015-11-09
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多