python學習日記(初識遞迴與演算法)
阿新 • • 發佈:2018-12-29
遞迴函式
定義
遞迴的定義——在一個函式裡再呼叫這個函式本身
遞迴的最大深度——997,即棧溢位。
使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。遞迴棧的溢位
def func(n): print(n) n += 1 func(n) func(1)
import sys print(sys.setrecursionlimit(100000))
例1
比如你問張三,張三你多大了?張三說他不告訴你,但張三比李四大兩歲。
你想知道張三多大,你是不是還得去問李四?李四說,我也不告訴你,但我比王五大兩歲。
你又問王五,王五r也不告訴你,他說他比趙六大兩歲。
那你問趙六,趙六告訴你,他10歲了。
這個時候你是不是就知道了?張三多大
趙六:10
王五:12
李四:14
張三:16
age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 40
如果用函式的話,怎麼寫呢?
def age(n):if n == 1: return 10 else: return age(n-1)+2 print(age(4))
這就實現了遞迴。
例二
使用遞迴函式實現階乘。
def func(n): if n == 1: return 1 else: return n * func(n-1) print(func(5))
二分查詢演算法
務必詳細看,理解每一行,謹記!
解決的問題有:返回值、end引數,索引
def fi(list,aim,start = 0,end = None): end= len(list)-1 if end is None else end mid = (end - start)//2 + start if start <= end: if list[mid] < aim: return fi(list,aim,start = mid+1,end = end) elif list[mid] > aim: return fi(list,aim,start = start,end = mid-1) else: return 'found you,aim索引:{},aim:{}'.format(mid,list[mid]) else: return aim,'不在列表中' l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] print(fi(l,3))
def search(li,a): start = 0 end = len(li)-1 found = False while start<=end and not found: mid = (end - start) // 2 if li[mid] == a: found = True else: if li[mid]>a: end = mid-1 else: start = mid+1 return found l1 = [1,2,3,4,5,6,7,8,9,10,11] print(search(l1,0))判斷是否在列表,是則True,否則False
pass