某些類型的列表輸入操作遞歸算法/實現都非常很容易拿出,如果你知道的「貓膩」。這招是:
只是假設你已經有一個功能,可以做你想做的。
等待,不,不沒有真正意義,不是嗎?那麼我們已經完成了。
我們認爲再次嘗試:
只是假設你已經有一個可以做你想做(但僅爲投入1元小於你需要)什麼功能。
那裏,好多了。雖然有點愚蠢,但這是我們可以合作的假設。
那麼我們想要什麼做?在你的例子中,它返回列表的最小和最大元素。假設我們希望他們返回爲2元組(也稱爲一個「對」):
lst = [5, 4, 100, 0, 2]
# Well, actually, we can only do this for a smaller list,
# as per our assumption above.
lst = lst[1:]
lst_min, lst_max = magic_min_max(l) # I want a pony!
assert lst_min == 0 # Wishful thinking
assert lst_max == 100 # Wishful thinking
如果我們有這樣一個神奇的功能,我們可以用它來解決問題的實際輸入尺寸是多少?讓我們試試:
def real_min_max(lst):
candidate = lst[0]
rest_of_the_list = lst[1:]
min_of_rest, max_of_rest = magic_min_max(rest_of_the_list) # Allowed because
# smaller than lst
min_of_lst = candidate if candidate < min_of_rest else min_of_rest
max_of_lst = candidate if candidate > max_of_rest else max_of_rest
return min_of_lst, max_of_lst
不是很容易,但很直截了當,不是嗎? 但讓我們假設我們的神奇功能magic_min_max
有一個額外的限制:它不能處理空列表。(畢竟,空單不已經既不是最小的,也不是最大的因素。甚至沒有魔法可以改變這一點。)
所以,如果lst
有大小1,我們不能稱之爲神奇的功能。儘管如此,我們沒問題。這種情況很容易檢測到和容易規避。單個元素既是其列表的最小值也是最大值,因此我們只返回它兩次:
def real_min_max(lst):
candidate = lst[0]
if len(lst) == 1:
return candidate, candidate # single element is both min & max
rest_of_the_list = lst[1:]
min_of_rest, max_of_rest = magic_min_max(rest_of_the_list) # Allowed because
# smaller than lst
# but (if we get
# here) not empty
min_of_lst = candidate if candidate < min_of_rest else min_of_rest
max_of_lst = candidate if candidate > max_of_rest else max_of_rest
return min_of_lst, max_of_lst
所以就是這樣。
但是等等... 沒有魔法。如果我們想調用一個函數,它必須實際存在。所以我們需要實現一個可以返回列表的最小值和最大值的函數,所以我們可以在real_min_max
而不是magic_min_max
中調用它。由於這是關於遞歸,你知道的解決方案:real_min_max
是該功能(一旦它通過調用一個函數,不存在固定的),所以我們可以把它稱之爲自己:
def real_min_max(lst):
candidate = lst[0]
if len(lst) == 1:
return candidate, candidate # single element is both min & max
rest_of_the_list = lst[1:]
min_of_rest, max_of_rest = real_min_max(rest_of_the_list) # No magic needed,
# just recursion!
min_of_lst = candidate if candidate < min_of_rest else min_of_rest
max_of_lst = candidate if candidate > max_of_rest else max_of_rest
return min_of_lst, max_of_lst
讓我們試一下:
lst = [5, 4, 100, 0, 2]
real_min_max(lst) # returns (0, 100)
它的工作原理!
你嘗試過什麼嗎?一個有兩個最小值和最大值參數的常規循環會執行這個技巧 –
StackOverflow不是一個代碼編寫論壇。你試過什麼了?請展示你的工作。 – Soviut
你可以寫一個返回'Max(lst),Min(lst)'的函數。這將是低效率的,因爲它會遞歸兩次,但它是結合兩個現有函數的最簡單方法。 – BrenBarn