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 实例的检查应该在函数之外完成。您还必须考虑到,这仅适用于正 b
s.
我如何重写这段代码来计算一个数,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 实例的检查应该在函数之外完成。您还必须考虑到,这仅适用于正 b
s.