国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

求冪算法

2019-11-14 17:39:05
字體:
來源:轉載
供稿:網友

1.簡單遞歸

最簡單的求冪算法是根據xn=x*xn-1,使用遞歸:

def foo(x,n):    if n==0:        return 1    else:        return x*foo(x,n-1)

這樣求x的n次方,會進行n-1次乘法運算,n較大時效率很低。

2.高效遞歸

一種更高效的算法,可以將運算次數降到LogN的級別,由于:

xn=xn/2*xn/2  n為偶數時

xn=x(n-1)/2*x(n-1)/2*x , n為奇數時

def foo(x,n):    if n==0:        return 1    else:        if n%2==0:            return foo(x,n/2)*foo(x,n/2)        else:            return foo(x,n/2)*foo(x,n/2)*x

可以將運算次數降到LogN的級別。

3.快速求冪

還有一種快速求冪算法,稱為二進制法:

比如求x的21次方,21的二進制為10101,由于x21=x16*x4*x1,可以看出根據二進制表示(10101),每當遇到1時,則乘以x,從右向左前進一位則將x自乘。

def foo(x,n):    result=1    while n:        if (n&1):            result*=x        x*=x        n>>=1    return result

這個算法用來計算非常的大的數時是十分高效的。例如有很多的素數測試算法都是依賴這個算法的不同變式。

4.抽象化

然后在某個地方我看到一個很有意思的想法,就是把上面的算法中的自乘函數化:

def foo(x,n,i,func):    result=i    while n:        if (n&1):            result=func(result,x)        x=func(x,x)        n>>=1    return resultif __name__=='__main__':    PRint foo(2,16,1,lambda x,y:x*y)

這樣求x的n次方就能用foo(x,n,1,lambda x,y:x*y)來運算了。

如果求x*n,相當于將x自加n次,可以用foo(x,n,0,lambda x,y:x+y)來運算:

def foo(x,n,i,func):    result=i    while n:        if (n&1):            result=func(result,x)        x=func(x,x)        n>>=1    return resultif __name__=='__main__':    print foo(2,16,0,lambda x,y:x+y)

如果要把某個字符x重復n次,可以用:

def repeat(x,n,i,func):    result=i    while n:        if (n&1):            result=func(result,x)        x=func(x,x)        n>>=1    return resultif __name__=='__main__':    print repeat('a',16,'',lambda x,y:x+y)

把一個列表復制n次:

def repeat(x,n,i,func):    result=i    while n:        if (n&1):            result=func(result,x)        x=func(x,x)        n>>=1    return resultif __name__=='__main__':    print repeat([1,2],16,[],lambda x,y:x+y)

參考自:http://videlalvaro.github.io/2014/03/the-power-algorithm.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 古浪县| 吕梁市| 叶城县| 莱西市| 开原市| 蒙阴县| 天津市| 永寿县| 石林| 泽普县| 香格里拉县| 密云县| 清苑县| 洪湖市| 松滋市| 辽源市| 大同市| 凌云县| 东海县| 泗水县| 牡丹江市| 泊头市| 屏南县| 弥勒县| 新闻| 奈曼旗| 凌海市| 桓台县| 莱州市| 和龙市| 建阳市| 开平市| 崇阳县| 宁安市| 房山区| 邮箱| 沿河| 蛟河市| 定安县| 文化| 临沧市|