python中的最大递归深度

时间:2017-03-15 22:44:23

标签: python tail-recursion

如何在不超过最大递归深度的情况下重写此代码来计算数字,增加到幂,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)

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您的代码存在一些缺陷和逻辑错误。

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

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

由于你已经在函数中添加了一些条件,这些条件会返回不同的东西,你似乎明白必须有某种停止条件。

您正确的递归通话是:

return a * power(a,b-1)

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

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

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的实例应该在函数之外完成。您还必须考虑到,这仅适用于积极的b