2017-02-09 61 views
-1

這裏是我的代碼 -需要兩個功能結合成一個(Python)的

def Max(lst): 
    if len(lst) == 1: 
     return lst[0] 
    else: 
     m = Max(lst[1:]) 
     if m > lst[0]: 
      return m 
     else: 
      return lst[0] 
def Min(lst): 
    if len(lst) == 1: 
     return lst[0] 
    else: 
     m = Min(lst[1:]) 
     if m < lst[0]: 
      return m 
     else: 
      return lst[0] 
print("Max number:",Max([5,4,100,0,2])) 
print("Min number:",Min([5,4,100,0,2])) 

基本上,我需要的是同時返回的最大和最小數量的單一功能,它需要遞歸。我將如何更改此代碼?

+1

你嘗試過什麼嗎?一個有兩個最小值和最大值參數的常規循環會執行這個技巧 –

+1

StackOverflow不是一個代碼編寫論壇。你試過什麼了?請展示你的工作。 – Soviut

+0

你可以寫一個返回'Max(lst),Min(lst)'的函數。這將是低效率的,因爲它會遞歸兩次,但它是結合兩個現有函數的最簡單方法。 – BrenBarn

回答

0
import sys 


class MaxMin: 
    max = -sys.maxint - 1 
    min = sys.maxint 

    def getMaxMin(self, lst, obj): 
     if len(lst) == 1: 
      obj.max = lst[0] 
      obj.min = lst[0] 
     else: 
      self.getMaxMin(lst[1:], obj) 
      if obj.max < lst[0]: 
       obj.max = lst[0] 
      if obj.min > lst[0]: 
       obj.min = lst[0] 

obj = MaxMin() 
obj.getMaxMin([5,4,100,0,2], obj) 
print("Max number:",obj.max) 
print("Min number:",obj.min) 
0

這是高階函數確切的想法。您可以在您的功能中添加compare參數,並通過lambda a, b: a>b獲取Minlambda a, b: a < b的最大值。然後,而不是m > lst[0],使用compare(m, lst[0])

2

某些類型的列表輸入操作遞歸算法/實現都非常很容易拿出,如果你知道的「貓膩」。這招是:

只是假設你已經有一個功能,可以做你想做的。

等待,不,不沒有真正意義,不是嗎?那麼我們已經完成了。

我們認爲再次嘗試:

只是假設你已經有一個可以做你想做(但僅投入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) 

它的工作原理!