lambda不好寫,寫了前兩個,把-2改為-7,改成-7后,我試過x必須大于4。-2時x可以從1開始
公司主營業(yè)務:成都網(wǎng)站設計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出西烏珠穆沁免費做網(wǎng)站回饋大家。
#遞歸
def?power(n,?x):
if?abs(1/pow(n,?x))abs(pow(10,?-2)):
return?0#回歸條件
else:
m?=?n?+?1#遞歸因子
if(n%2==1):
return?1/pow(n,?x)+power(m,?x)#求和奇正
else:
return?-1/pow(n,?x)+power(m,?x)#求和偶負
def?power2(n,?x):
sum?=?0
while(1/pow(n,x)abs(pow(10,?-2))):
if?(n?%?2?==?1):
sum+=?1?/?pow(n,?x)
else:
sum+=-1?/?pow(n,?x)
n?+=?1??#?遞增
return?sum
if?__name__?==?"__main__":
x?=?input("請輸入冪數(shù)")
x?=?int(x)
n?=?1
sum?=?power(n,?x)
print(sum)
n=1
sum?=?power2(n,?x)
print(sum)
遞歸的思想主要是能夠重復某些動作,比如簡單的階乘,次方,回溯中的八皇后,數(shù)獨,還有漢諾塔,分形。
由于堆棧的機制,一般的遞歸可以保留某些變量在歷史狀態(tài)中,比如你提到的return x * power..., 但是某些或許龐大的問題或者是深度過大的問題就需要盡量避免遞歸,因為可能會棧溢出。還有一個問題是~python不支持尾遞歸優(yōu)化!?。?!所以~還是盡量避免遞歸的出現(xiàn)。
def power(x, n)
if n 0:
return 1
return x * power(x, n - 1)
power(3, 3)
3 * power(3, 2)
3 * (3 * power(3, 1))
3 * (3 * (3 * power(3, 0)))
3 * (3 * (3 * 1)) 這里n = 0, return 1
3 * (3 * 3)
3 * 9
27
當函數(shù)形參n=0的時候,開始回退~直到第一次調用power結束。
python用遞歸函數(shù)求1+2+3+4+5的值的方法:
1、寫出臨界條件
2、找這一次和上一次的關系
3、假設當前函數(shù)已經(jīng)能用,調用自身計算上一次的結果,再求出本次的結果
代碼實現(xiàn)如下:
例如上面的例子,實現(xiàn)一個整形集合的累加。假設lst = [1,2,3,4,5],實現(xiàn)累加的方式有很多:
第一種:用sum函數(shù)。
sum(lst)
第二種:循環(huán)方式。
def customer_sum(lst):
result = 0
for x in lst:
result+=x
return result
def customer_sum(lst):
result = 0
while lst:
temp = lst.pop(0)
result+=temp
return result
if name ==" main ":
lst = [1,2,3,4,5]
print customer_sum(lst)
第三種:遞推求和
def add(lst,result):
if lst:
temp = lst.pop(0)
temp+=result
return add(lst,temp)
else:
return result
if name ==" main ":
lst = [1,2,3,4,5]
print add(lst,0)
第四種:reduce方式
lst = [1,2,3,4,5]
print reduce(lambda x,y:x+y,lst)
lst = [1,2,3,4,5]
print reduce(lambda x,y:x+y,lst,0)
def add(x,y):
return x+y
print reduce(add, lst)
def add(x,y):
return x+y
print reduce(add, lst,0)
有一個序列集合,例如[1,1,2,3,2,3,3,5,6,7,7,6,5,5,5],統(tǒng)計這個集合所有鍵的重復個數(shù),例如1出現(xiàn)了兩次,2出現(xiàn)了兩次等。大致的思路就是用字典存儲,元素就是字典的key,出現(xiàn)的次數(shù)就是字典的value。方法依然很多
第一種:for循環(huán)判斷
def statistics(lst):
dic = {}
for k in lst:
if not k in dic:
dic[k] = 1
else:
dic[k] +=1
return dic
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print(statistics(lst))
第二種:比較取巧的,先把列表用set方式去重,然后用列表的count方法
def statistics2(lst):
m = set(lst)
dic = {}
for x in m:
dic[x] = lst.count(x)
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print statistics2(lst)
第三種:用reduce方式
def statistics(dic,k):
if not k in dic:
dic[k] = 1
else:
dic[k] +=1
return dic
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print reduce(statistics,lst,{})
或者
d = {}
d.extend(lst)
print reduce(statistics,d)
通過上面的例子發(fā)現(xiàn),凡是要對一個集合進行操作的,并且要有一個統(tǒng)計結果的,能夠用循環(huán)或者遞歸方式解決的問題,一般情況下都可以用reduce方式實現(xiàn)。
首先我們要了解一下什么是遞歸。
遞歸法,遞歸法就是利用上一個或者上幾個狀態(tài)來求取當前狀態(tài)的值(個人看法)。也可以說成函數(shù)自己調用自己的一種解決問題的策略。因此遞歸法通常是依托函數(shù)來實現(xiàn)的,遞歸函數(shù)總是會有一個出口,我們在解決遞歸問題時,只需要找出遞歸的關系式以及遞歸函數(shù)的出口(這兩個可以說是遞歸函數(shù)的核心了)。下面我將在這里舉求斐波那契值的例子帶領著大家具體的實踐一下遞歸法。
很顯然遞歸函數(shù)的遞推式是:fib(n) = fib(n-1)+fib(n-2)。
遞歸函數(shù)的出口是當n為1時返回1,當n為0時返回0。
最后遞歸函數(shù)的核心代碼就可以寫出了:
然后總的代碼就是:
具體思路如下:
語句 return fib(n-1)+fib(n-2)的意思就是向前求斐波那契值,直到n-1=1,n-2=0
因為只有第1個和第0個斐波那契值是確定的
例:
當n=3時
第一次調用函數(shù)fib會執(zhí)行第三條語句(因為n1)這樣求回返回fib(2)+fib(1)
第二次調用函數(shù)時,因為21所有會返回fib(1)+fib(0);因為1不大于1,所以調用函數(shù)時
會執(zhí)行第二條語句返回1值。
第三次調用函數(shù),會執(zhí)行第一和第二條語句,依次返回0和1從而求得fib(2)
fib(3)=fib(2)+fib(1)
fib(2)=fib(1)+fib(0)
即fib(3)=fib(1)+fib(0)+fib(1)=2*fib(1)+fib(0)