幂函数Python
这个函数是计算a^b的值并返回它。我的问题是m=log(b) 最好的情况是它进行m+1交互 但最坏的情况是什么?它进入while循环多少次幂函数Python,python,interaction,Python,Interaction,这个函数是计算a^b的值并返回它。我的问题是m=log(b) 最好的情况是它进行m+1交互 但最坏的情况是什么?它进入while循环多少次 def power(a,b): result=1 while b>0: # b is nonzero if b % 2 == 1: result=result*a a=a*a b = b//2 return result 正如@EliSadoff在注释中
def power(a,b):
result=1
while b>0: # b is nonzero
if b % 2 == 1:
result=result*a
a=a*a
b = b//2
return result
正如@EliSadoff在注释中所述,在函数中需要初始值
result
。插入行
result = 1
就在def
行之后。然后代码就可以工作了,这是隐式使用b
的二进制表示来快速获得求幂的标准方法。(循环不变量是result*a**b
的值保持不变,这表明了该算法的有效性。)
最坏的情况是每次通过while
循环执行b%2行时执行。每当b
小于2的幂时,就会发生这种情况,因此b
s二进制表示中的每个数字都是一。while
循环条件while b>0
仍然只检查m+1
次,但现在每个循环都有更多的工作要做
有几种方法可以加快代码的速度。在b时使用而不是而b>0和如果b&1而不是如果b%2=1
。使用result*=a
而不是result=result*a
和a*=a
而不是a=a*a
和b>=1
而不是b=b//2
。当然,这些都是相当小的改进。进一步加速循环的唯一方法是使用非结构化代码,我认为这在Python中是不可能的。(对a
的修改比必要的多了一次,但如果不跳入循环,就没有好的方法来防止这种情况发生。)此代码有一些变化,例如,只要b
是偶数,就有一个内循环来不断修改a
和b
,但这并不总是更快
最后的代码是
def power(a, b):
"""Return a ** b, assuming b is a nonnegative integer"""
result = 1
while b:
if b & 1:
result *= a
a *= a
b >>= 1
return result
我稍微整理了一下您的代码,以更好地适应PEP8(Python风格标准)。请注意,代码中没有错误检查,特别是为了确保b
是非负整数。如果b
是一个负整数,而您的返回一个假结果,我相信我的代码会得到一个无限循环。所以,请进行错误检查!还要注意的是,您的代码显示的是power(0,0)=1
,这对于这样的函数来说是非常标准的,但仍然会让一些人感到惊讶。正如@EliSadoff在一篇评论中所说的,您的函数中需要一个初始值result
。插入行
result = 1
就在def
行之后。然后代码就可以工作了,这是隐式使用b
的二进制表示来快速获得求幂的标准方法。(循环不变量是result*a**b
的值保持不变,这表明了该算法的有效性。)
最坏的情况是每次通过while
循环执行b%2
行时执行。每当b
小于2的幂时,就会发生这种情况,因此b
s二进制表示中的每个数字都是一。while
循环条件while b>0
仍然只检查m+1
次,但现在每个循环都有更多的工作要做
有几种方法可以加快代码的速度。在b时使用而不是而b>0和如果b&1而不是如果b%2=1
。使用result*=a
而不是result=result*a
和a*=a
而不是a=a*a
和b>=1
而不是b=b//2
。当然,这些都是相当小的改进。进一步加速循环的唯一方法是使用非结构化代码,我认为这在Python中是不可能的。(对a
的修改比必要的多了一次,但如果不跳入循环,就没有好的方法来防止这种情况发生。)此代码有一些变化,例如,只要b
是偶数,就有一个内循环来不断修改a
和b
,但这并不总是更快
最后的代码是
def power(a, b):
"""Return a ** b, assuming b is a nonnegative integer"""
result = 1
while b:
if b & 1:
result *= a
a *= a
b >>= 1
return result
我稍微整理了一下您的代码,以更好地适应PEP8(Python风格标准)。请注意,代码中没有错误检查,特别是为了确保b
是非负整数。如果b
是一个负整数,而您的返回一个假结果,我相信我的代码会得到一个无限循环。所以,请进行错误检查!还要注意的是,您的代码显示的是power(0,0)==1
,这对于此类函数来说是相当标准的,但仍然会让一些人感到惊讶。这不应该起作用<代码>结果
未声明,我不理解您用于计算功率的逻辑。试试看,它应该可以工作。它使用了一个数学原理,我将其解释为代码。当我尝试它时,我得到了以下信息:UnboundLocalError:local变量'result'在赋值之前被引用。
。在while循环之前添加result=1这不应该工作<代码>结果
未声明,我不理解您用于计算幂的逻辑。尝试一下,它应该会起作用。它使用我解释为代码的数学原理。尝试时,我得到以下结果:UnboundLocalError:赋值前引用的局部变量“result”
。在while循环之前添加result=1