1. 程式人生 > >python學習日記(初識遞迴與演算法)

python學習日記(初識遞迴與演算法)

遞迴函式

定義

遞迴的定義——在一個函式裡再呼叫這個函式本身

遞迴的最大深度——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