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