2013-05-31 3 views
-2
def chooseBest(s): 
    if len(s) == 2: 
     c = cmp(s[0], s[1]) 
     if c == -1 or c == 0: 
      return s[0] 
     elif c == 1: 
      return s[1] 
    else: 
     return chooseBest(s[1:]) 

Где находится список сопоставимых значений.Рекурсивное сравнение, можете ли вы указать на мою ошибку?

+2

В чем проблема? –

+3

, когда вы задаете вопрос, напишите ваши намерения явно. что вы пытались сделать? в каком контексте? – Elazar

+0

На основе кода, который есть, кажется, что цель состоит в том, чтобы найти наименьший элемент в последовательности. – morningstar

ответ

0

Если вы пытаетесь рекурсивно найти самый большой элемент в списке сопоставимых значений, вот как это должно быть сделано:

def chooseBest(s): 
    if not s: 
     return None 
    best = chooseBest(s[1:]) 
    return s[0] if s[0] > best else best 

Или еще короче:

def chooseBest(s): 
    return max(s[0], chooseBest(s[1:])) if s else None 

В любом случае, это работает для встроенных сопоставимых типов данных. Если по какой-то причине вам необходимо сравнить его с типом, который вы определили, не забудьте сделать его сопоставимым с None:

chooseBest([1, 2, 5, 3, 4]) 
=> 5 

chooseBest(['a', 'b', 'z', 'c', 'd']) 
=> 'z' 
+1

лучший крайный случай - 'if len (s) == 1: return s [0]'. нет необходимости предполагать что-либо о типе контента. – Elazar

+0

Я не думаю, что это лучше, он не удастся, если список пуст. –

+0

«best» для неизвестного типа не определено, если список пуст, поэтому это может быть хорошей идеей; если вы не согласны, вы можете вернуть «Нет». – Elazar

2

Подумайте, может ли selectBest ([x, y, z]) когда-либо вернуть x.

Смежные вопросы