python 中的最大递归深度

Maximum recursion depth in python

我如何重写这段代码来计算一个数,a 的幂 b,而不超过最大递归深度

def power(a,b):
  if isinstance(a,(int,float)) and isinstance(a,(int,float)):
    return power(a,b)
  else:
    raise TypeError("Argument must be integer or float")
  if b == 0:
    return 1
  elif b == 1:
    return a
  while b >=1:
    return a * power(a,b-1)
  if b == 0:
    return power(a,b)

首先,你应该检查包装函数中的参数有效性;您在每次迭代中都浪费了大量时间和模块化检查。此外,您还需要检查 b ;在此代码中,您检查了 a 两次。最后,您的逻辑假设 b 是一个整数,因此您需要限制验证。

删除你的 b==1 基本情况:b==0 将在下一次迭代中捕获它。

删除 while 循环:这是迭代解决方案。您的递归解决方案只是检查基本条件 (b==0);否则,return a*power(a, b-1),正如您已经在做的那样。

您的代码有几个缺陷和逻辑错误。

正如 DYZ 在评论中已经提到的,如果 a 和 b 是数字,您的函数会立即进入无限递归:您尝试 return 对 power() 的完全相同的调用。

def power(a,b):
  if isinstance(a,(int,float)) and isinstance(a,(int,float)):
    return power(a,b)

因为你已经在你的函数中加入了一些条件,这将 return 一些不同的东西,你似乎明白必须有某种停止条件。

你正确的递归调用是:

return a * power(a,b-1)

这 return 是对函数的不同调用,因此不会导致立即无限递归。

你的停止条件也是正确的:

if b == 0:
    return 1

检查 b == 1 是不必要的,因为它会在下一次递归中被 b == 0 捕获,正如 Prunes 回答中所指出的那样。

将所有这些按正确的顺序放在一起,你会得到

def power(a,b):
    if b == 0:
        return 1
    else:
        return a * power(a,b-1)

在我看来,对 int 或 float 实例的检查应该在函数之外完成。您还必须考虑到,这仅适用于正 bs.