2016-07-22 14 views
2

私は、リスト内の最大値を有するものを見つけようとする機能書きました:私の出力が間違っている再帰関数との最大の要素を見つける

def maxElement(L): 
    length=len(L) 
    if L[length-1]>L[length-2]: 
     del L[length-2] 
     print L 
    elif L[length-1]<L[length-2]: 
     del L[length-1] 
    return L 

print maxElement([1,2,95754754745,3,1,8,444,2,42425]) 

を:

>>> 
[1, 2, 95754754745L, 3, 1, 8, 444, 42425] 
[1, 2, 95754754745L, 3, 1, 8, 444, 42425] 
>>> 

それはdoesnの私が欲しいものを私のために削除しないでください。私は何を間違えたのですか?私はそれを得ることができません!

+3

あなたが書いた関数は再帰的ではありません。関数を再帰的に呼び出すには、 'def a_function()'ブロック内にある関数自身が 'a_function()'呼び出しを持っている必要があります。おそらくあなたが知っているように、これまで述べていないので、単に 'max()'を使い、あなたのリスト 'L'を' max_item = max(L) 'のように渡すことができます。私はあなたがすでにそれを知っていると仮定します。 –

+0

@Rawing whileループを追加しても、この関数は再帰的になりません。 – Jokab

+0

要素を削除しました - 最後の '2'。 –

答えて

6

あなたの関数を再度呼び出すのではなく、再帰を不可能にします。さらに、あなたは、この場合になり、再帰を停止する一切のベースケースを、持っていない:

def maxElement(L): 
    length=len(L) 
    if length == 1: 
     return L 
    elif L[length-1]>=L[length-2]: 
     del L[length-2] 
    elif L[length-1]<=L[length-2]: 
     del L[length-1] 
    return maxElement(L)  

print maxElement([1,2,95754754745,3,1,8,444,2,42425]) 

この出力:ここ

if length == 1: 
    return L 

は、固定されたコードがある

python recursive.py 
> [95754754745L] 

私はまた、最大値を共有する2つの要素が存在する場合、無限再帰を避けるために条件式に<=>=を追加しました。

+0

おかげで多く、それが最後にLを出力する理由: >>> [95754754745L] >>> – Lucia

+0

@Luciaはhttp://stackoverflow.com/questions/11764713/why-do-integersこの回答を参照してください。 -in-database-row-tuple-have-an-l-suffix – Jokab

6

これは、あなたがしたこととまったく同じでした。

最後にもう一度呼び出すのを忘れたので、関数は再帰的ではありません。このような

何かが、あなたが探しているものです。

def maxElement(L): 
    length=len(L) 
    if L[length-1]>L[length-2]: 
     del L[length-2] 
     print L 
    elif L[length-1]<L[length-2]: 
     del L[length-1] 
    if len(L) == 1: 
     return L 
    return maxElement(L) 

print maxElement([1,2,95754754745,3,1,8,444,2,42425]) 

これは返します:

[1, 2, 95754754745L, 3, 1, 8, 444, 42425] 
[1, 2, 95754754745L, 3, 1, 8, 42425] 
[1, 2, 95754754745L, 3, 1, 42425] 
[1, 2, 95754754745L, 3, 42425] 
[1, 2, 95754754745L, 42425] 
[1, 95754754745L] 
[95754754745L] 
[95754754745L] 

次のように私はそれがもう少し良くなるだろう:

def maxElement(L): 
    length=len(L) 

    if length == 1: 
     # Have this condition on the top because you are using length - 2 later 
     # Just return the only element 

     return L 

    if L[length-1] > L[length-2]: 
     # If the last element is greater than the last but one, delete the last but one 
     del L[length - 2] 

    else: 
     # Simple else would suffice because you are just checking for the opposite 
     # Also this condition saves you from: 
     #  infinite looping when the last two elements are equal 
     del L[length - 1] 

    print L 

    # Time to call it recursively. 
    # But if you just don't want to unnecessarily increase the recursion 
    # tree depth, check for length and return it 

    if length == 1: 
     return L 
    return maxElement(L) 
+0

この関数は質問に含まれる入力値に対して正しい値を生成しますが、最大値が2つ以上のインデックスにある場合、無限再帰が発生します。私の答えを見てください。 – Jokab

+1

それをチェックし、同じのupvoted :)それを世話するために私の答えを編集しました。 –

2

なぜ単にmax()を使用していないのですか?

MAX([1,2,95754754745,3,1,8,444,2,42425])

95754754745L

+2

おそらくOPは再帰を練習したかったでしょう。 – Jokab