(資料結構python版)第4章遞迴

2021-09-26 10:09:09 字數 4232 閱讀 5017

階乘函式

n !=

1\\ n\times(n-1)\times(n-2)...3\times2\times1 \end

n!=n=0\\ n\geq1 \end

'.format

(total)

,path)

return total乙個糟糕的遞迴顯示導致嚴重的效率低下

def

bad_dibonacci

(n):

if n<=1:

return n

else

:return bad_dibonacci(n-2)

+bad_dibonacci(n-1)

if __name__ ==

'__main__'

:print

(bad_dibonacci(50)

)

def

good_fibonacci

(n):

if n<=1:

return n,

0else

:(a,b)

=good_fibonacci(n-1)

return a+b,a

if __name__ ==

'__main__'

:print

(good_fibonacci(50)

)

python中最大遞迴深度

應該確保每個遞迴呼叫以某種方式逐步向基本情況發展(如:減少引數)

import sys

old=sys.getrecursionlimit(

)# 得到當前的最大遞迴深度

sys.setrecursionlimit(

10000

)# 設定最大遞迴深度

線性遞迴

階乘函式的實現,高效的斐波那契數列函式是線性遞迴鮮明的例子

二分查詢也是線性遞迴的乙個例子

元素序列的遞迴求和

def

linear_sum

(s,n)

:if n==0:

return

0else

:return linear_sum(s,n-1)

+s[n-1]

if __name__ ==

'__main__'

: l=[1

,2] ret = linear_sum(l,

len(l)

)print

(ret)

使用遞迴逆置序列

def

reverse

(s,start,stop)

:if starts[start]

,s[stop]

=s[stop]

,s[start]

reverse(s,start+

1,stop-1)

if __name__ ==

'__main__'

: l =[2

,512,76

,12,131,1

,7] reverse(l,0,

len(l)-1

)print

(l)

計算冪函式

def

power

(x,n)

:if n==0:

return

1else

:return x*power(x,n-1)

if __name__ ==

'__main__'

:print

(power(2,

10))

使用重複的平方計算冪函式(更快的計算冪函式)

def

power

(x,n)

:if n==0:

return

1else

: partial=power(x,n//2)

result=partial*partial

if n%2==

1:result*=x

return result

if __name__ ==

'__main__'

:print

(power(2,

10))

時間複雜度為o(l

ogn)

o(logn)

o(logn

),比之前的o(n

)o(n)

o(n)

提高了二路回歸

英式標尺,低效的斐波那契數列是二路回歸的例子

二路回歸計算乙個序列的元素之和

以遞迴的計算前一半元素的總和和後一半元素的總和

def

binary_sum

(s,start,stop)

:if start>=stop:

return

0elif start == stop-1:

return s[start]

else

: mid=

(start+stop)//2

return binary_sum(s,start,mid)

+ binary_sum(s,mid,stop)

if __name__ ==

'__main__'

: l=[1

,4,2

,12,72

,423,31

,46,2

,1] ret = binary_sum(l,0,

len(l)

)print

(ret)

使用o(l

ogn)

o(logn)

o(logn

)數量級的額外空間,與前面的o(n

)o(n)

o(n)

是乙個巨大的進步

多路遞迴

例子:形式:

遞迴的優點:能夠簡介地利用重複結構呈現諸多問題

尾遞迴:不使用任何輔助儲存空間的情況下消除遞迴

二分查詢演算法的非遞迴實現

def

binary_search_iterative

(data,target)

: low =

0 high =

len(data)-1

while low<=high:

mid =

(low+high)//2

if target == data[mid]

:return

true

elif target < data[mid]

: high=mid-

1else

: low=mid+

1return

false

if __name__ ==

'__main__'

: l =[0

,1,3

,3,5

,5,6

,7,7

,8,8

,8,9

,10] ret = binary_search_iterative(l,0)

print

(ret)

使用迭代逆置乙個序列的元素

def

reverse_iterative

(s):

start,stop=0,

len(s)

while starts[start]

,s[stop-1]

=s[stop-1]

,s[start]

start,stop=start+

1,stop-

1if __name__ ==

'__main__'

: l=[36

,23,6

,236,82

,3412

] reverse_iterative(l)

print

(l)

python資料結構第4天

棧的python實現 class stack def init self self.items def is empty self return self.items def push self,item def pop self self.items.pop def peek self retur...

第4章 005內建資料結構 集合

我 4 python內建資料結構 python 還提供了另外一種資料型別 set。set用於包含一組無序的不重複物件。所以set中的元素有點像dict的key。這是set與list的最大區別 set基本應用有元素測試 去除list tuple中的重複元素。set也支援一些數學操作,像 並集 unio...

第9章 資料結構

第9章 資料結構 my frames,button my sub of 日誌查詢 push button2 溫金簡訊查詢 push button3 中均簡訊查詢 push button4 機器資訊查詢 push button5,ip資訊查詢 push button6,裝置資訊維護 push butt...