Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
幂函数Python_Python_Interaction - Fatal编程技术网

幂函数Python

幂函数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在注释中

这个函数是计算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在注释中所述,在函数中需要初始值
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