2017-02-26 16 views
-1
def min_max(L): 

    if len(L) == 1: 
     res = [L[0], L[0]] 

    else: 
     res = min_max(L[1:]) 

     if (L[0] < res[0]): 
      res[0] = L[0] 

     if (L[0] > res[1]): 
      res[1] = L[0] 

    return res 

ここに私のコードがあります。要素が1つだけの場合、その要素は最小値と最大値の両方です。それ以外の場合は、リストの要素の最小値と最大値を先に見つけて比較し、大きいか小さいかを比較します。反復とループを使用してネストされたリストのPythonの最小最大値を見つける

入れ子リストの場合はこれを行う必要があります。私がやったことは、if len(L) == 1の前にこの行のコードを追加することでした。

if isinstance(L[0],list): 
    res = min_max(L[0]) 

elif len(L) == 1: 
    res = [L[0], L[0]] 

これは部分的に動作しますが、min_max([[3,2],4])のような例では、私はこの問題を解決するにはどうすればよい4.を考慮せずに[2,3]を返しますか?

答えて

1

次作品:これはむしろ、一度に一つの要素によってそれらを削りよりも、半分のたびにリストを切ること

def min_max(L): 
    length = len(L) 
    if length == 1: 
     if isinstance(L[0],list): // sole element is a list, return its min & max 
      return min_max(L[0]) 
     else: 
      return [L[0], L[0]] // otherwise it is both the min & max 
    else: 
     mid = length // 2 
     result = min_max(L[:mid]) // find min and max of first half of list 
     result2 = min_max(L[mid:]) // ditto for second half of list 
     // now determine which of the two sets are the min and max of current list 
     if (result2[0] < result[0]): 
      result[0] = result2[0] 
     if (result2[1] > result[1]): 
      result[1] = result2[1] 
     return result 

注意。あなたはまだすべての要素を調べることになりますが、スタック上の呼び出しの数はリストの長さのログに比例して増加するので、このバージョンはあなたが作成できるリストのほとんどすべてで動作します。 1000個未満の要素

あなたはおそらく、空のリストまたはサブリストを懸念している場合:

def min_max(L): 
    length = len(L) 
    if length > 1: 
     mid = length // 2 
     result = min_max(L[:mid]) 
     result2 = min_max(L[mid:]) 
     if (result2[0] < result[0]): 
      result[0] = result2[0] 
     if (result2[1] > result[1]): 
      result[1] = result2[1] 
     return result 
    elif length == 1: 
     if isinstance(L[0],list): 
      return min_max(L[0]) 
     else: 
      return [L[0], L[0]] 
    else: 
     return [float('inf'), -float('inf')] 
0

余分なパラメータとして現在の最小値&を渡すことで、コードを少し簡略化できます。次に、あなたのコードは基本的に3つの異なるシナリオの世話をする必要があります。

  1. 与えられたリストが空である - >パラメータから&最大最小リターン
  2. リストの
  3. 最初の要素がリストである - >ネストされたリストと再帰と分& maxは、リスト上のリストの残りの部分と再帰的
  4. 最初の要素は、コードは次のようになります分&最大を更新し、実際に

リストの残りの部分と再帰的、数あります:

def min_max(L, minimum=float('inf'), maximum=-float('inf')): 
    # Base case, return accumulated result 
    if not L: 
     return minimum, maximum 

    if isinstance(L[0], list): 
     # Element is a list, recurse with it 
     minimum, maximum = min_max(L[0], minimum, maximum) 
    else: 
     # Element is a number, update current min & max 
     minimum = min(minimum, L[0]) 
     maximum = max(maximum, L[0]) 

    # Process rest of the elements on the list 
    return min_max(L[1:], minimum, maximum) 

print(min_max([[3,2],4])) 

出力:私のために

(2, 4) 
+0

イムないものを 'フロート( 'INF')'手段を確認してください? –

+0

['float( 'inf')'](https://docs.python.org/3.6/library/functions.html#float)は他のすべての数値より大きい無限大の浮動小数点値ですので、使用すると便利です任意の数のリストがそれより小さくなり、したがって選択されるので、最小値のデフォルト値として使用されます。 '-float( 'inf')'をデフォルトの最大値として使用することも同じです。 – niemmi

関連する問題