我有一个递归函数,当我使用超出限制的数字时,会出现此错误“运行错误:cmp中超出最大递归深度”。我期待使except块返回-1(这是要求)并且控件没有被转移到except块。请告诉我我的计划有什么问题。提前致谢
def g(n):
try:
def f(x):
if x == 1:
return 1
elif x == 0.5:
return math.sqrt(PI)
else:
final_value = (x-1)*f(x-1)
return final_value
except RuntimeError:
return -1
n = f(n/2.0)
return n
你的try
中唯一的东西(忽略IndentationError
,希望你的实际代码中没有它)是def
声明。定义函数不会引发RuntimeError
,所以没有什么可以捕获的。
调用函数会引发一个RuntimeError
,所以你需要围绕函数调用的try
。两个显而易见的地方是递归调用:
try:
final_value = (x-1)*f(x-1)
except RuntimeError:
return -1
return final_value
......或在外线电话周围:
try:
n = f(n/2.0)
except RuntimeError:
return -1
return n
我不知道你想要哪一个。在外部调用中处理它意味着所有1000个递归帧都被丢弃,你只需从顶层开始return -1
。在内部调用中处理它意味着你从最里面的帧返回-1
,但是然后从那里到顶部的每个帧将-1
乘以其本地x-1
,然后再将其传回。希望你知道你想要哪一个。