標籤:有序數組 The 同學會 個人 告訴 實現 eva AC art
Python Day 15 (遞迴函式、二分尋找演算法)遞迴函式
在一個函數裡在調用這個函數本身。
遞迴的預設最大深度:998
修改預設最大深度
import sysprint(sys.setrecursionlimit(100000))
import syssys.setrecursionlimit(1000000)count = 1def my_func(): global count print(count) count += 1 my_func()my_func()===========================def my_age(n,start=23): if n == 2: return start elif 0 < n < 2: return my_age(n + 1) - 2 elif n > 2 : return my_age(n - 1) + 2 else: return ‘不存在。‘print(eval(‘my_age‘)(2))
二分尋找演算法
一個偶然的機會,我想起以前還在Google上班的時候,有時候大家會在飯桌上討論最新想出來的一些面試題。在眾多有趣又有難度的題目中,有一道老題卻是大家都紛紛選擇避開的,那就是去實現二分尋找。因為它很好寫,卻很難寫對。可以想象問了這道題後,在5分鐘之內面試的同學會相當自信的將那一小段代碼交給我們,剩下的就是考驗面試官能否在更短的時間內看出這段代碼的bug了。二分尋找是什麼呢,這個不只程式員,其他很多非技術人員也會。比如我想一個1到100以內的數,你來猜,我告訴你每次猜的是大了還是小了,你會先猜50,然後25, 然後。。。用不了幾個問題就猜出來了。1到100範圍太小的話,我們放大點猜個人名,你問中國人外國人,古代人現代人,男的女的,用不了幾個問題也問出來了。在電腦裡,則是在一個有序數組裡面,不斷通過二分的方法縮小關鍵字的可能下標範圍。當然了,我們不一定在一個有序數組裡尋找,也可以在一個很大的狀態空間裡,去尋找一個單調函數的取值。這樣的做法,似乎編個程式很容易實現,但是,D.Knuth大神說了:Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky 雖然二分尋找的基本思想相對來說很直接,但具體實現起來有特別多的坑。另一位大神,編程珠璣的作者Jon Bentley,他做了我們在文章開頭不敢做的事,他布置作業讓他的學生們寫二分尋找,然後他一個個來看。結果呢,他發現90%是錯的。因此在他的編程珠璣這本書中,專門有一章講解了二分尋找,雖然他的範例仍然是錯的,見下面的Java Bug。埋下這個bug的人,也正式Jon Bentley的學生。還有好事者,更是找了許多教科書,發現20本教科書裡面,只有5本是寫對了的,於是他發了一篇文章到ACM。當然這是早在1988年的時候。
如果有這樣一個列表,讓你從這個列表中找到66的位置,你要怎麼做?
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]
def search(num,l,start=None,end=None): start = start if start else 0 end = end if end else len(l) - 1 mid = (end - start)//2 + start if start > end: return None elif l[mid] > num : return search(num,l,start,mid-1) elif l[mid] < num: return search(num,l,mid+1,end) elif l[mid] == num: return mid
Python Day 15 (遞迴函式、二分尋找演算法)