現(xiàn)在有一個(gè)無序數(shù)組帆赢,需要把數(shù)組里面的數(shù)字按照從小到大的順序排列罚随,我們可以怎么做?
比較簡(jiǎn)單的一個(gè)方法是挨個(gè)去查看數(shù)組里面的數(shù)字下硕,找到最小的一個(gè)數(shù)字丁逝,然后把找到的這個(gè)最小數(shù)字放進(jìn)一個(gè)新數(shù)組,接下來再去找原先數(shù)組里面剩下的數(shù)字中最小的數(shù)字梭姓,找到后再放入新數(shù)組的末尾霜幼,這樣一直操作到數(shù)組中的數(shù)字被找完為止。
這種方法就是選擇排序誉尖,不斷選擇最小的數(shù)罪既,然后進(jìn)行排序。
def find_smallest(arr):
smallest = arr[0]
index = 0
for i in range(1, len(arr)):
if smallest > arr[i]:
smallest = arr[i]
index = i
return index
def selection_sort(arr):
new_arr = []
for _ in range(len(arr)):
smallest_index = find_smallest(arr)
new_arr.append(arr.pop(smallest_index))
return new_arr
print(selection_sort([4, 1, 5, 3, 2, 8, 7, 6, 9]))
>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]
如果現(xiàn)在需要去一棵樹的頂端摘一個(gè)果子铡恕,一般是先爬到第一個(gè)樹干琢感,然后再去第二個(gè)樹干,一直到樹的頂端探熔,摘到果子后驹针,還要從最靠近頂端的一個(gè)樹干,一個(gè)一個(gè)爬下來诀艰,遞歸和這個(gè)有點(diǎn)兒像柬甥。遞歸中有兩個(gè)條件,決定了這個(gè)遞歸是可執(zhí)行的其垄,第一個(gè)是基線條件苛蒲,在這里就是能夠在樹上摘到果子,第二個(gè)是遞歸條件绿满,這里就是可以到達(dá)下一個(gè)樹干臂外。這里還有一個(gè)棧的概念,就類似于爬的樹干棒口,一個(gè)個(gè)爬上去寄月,最后還得一個(gè)個(gè)爬下來。但是不一樣的是无牵,棧的數(shù)據(jù)是一個(gè)個(gè)從壓進(jìn)去,然后從頂部一個(gè)個(gè)拿出來厂抖。
一個(gè)比較簡(jiǎn)單的例子就是用遞歸來計(jì)算階乘茎毁,
def fact(x):
if x == 1:
return 1
else:
return x * fact(x-1)
print(fact(5))
>>>
120
可以看出,在計(jì)算過程中,把先計(jì)算出來的數(shù)放在一邊七蜘,直到最后達(dá)到基線條件時(shí)在一個(gè)個(gè)取出來繼續(xù)運(yùn)算谭溉。