Рекурсивный метод бисекции PYTHON [дубликат]

4
задан user3171116 14 January 2014 в 08:01
поделиться

4 ответа

Функция никогда не возвращается True. Я думаю, что он должен возвращать True, когда char == m, поэтому вы можете удалить его из if-clause (который возвращает False) и поместить его в другой if:

if char == m:
   return True
elif aStr == '' or len(aStr) == 1:
    return False
else:
    ...

Кроме того, вы вызываете метод isIn, который не определен. Я думаю, что вы хотели рекурсивно называть isitIn.

После сравнения char < m и char > m вы должны «делить пополам» строку, поэтому не делайте return isitIn(char, aStr[:-1]) и return isIn(char, aStr[1:]), вместо этого пропустите (в рекурсивном вызове) «половина» строки.

if char < m:
    return isitIn(char, aStr[:len(aStr) // 2])
elif char > m:
    return isitIn(char, aStr[len(aStr) // 2:])

Редактирование: на всякий случай, код, который я пробовал:

def isitIn(char, aStr):
    if aStr == '':  # Check for empty string
        return False
    m = aStr[len(aStr) // 2]
    if char == m:
       return True
    elif len(aStr) == 1:
        return False
    else:
       if char < m:
           return isitIn(char, aStr[:len(aStr) // 2])
       elif char > m:
           return isitIn(char, aStr[len(aStr) // 2:])
    return isitIn(char, aStr)
5
ответ дан Christian 26 August 2018 в 19:25
поделиться

В целом, ваш код выглядит неплохо. Но я бы более внимательно рассмотрел ваше первое заявление. В частности, вы проверяете, соответствует ли символ среднему символу. Что бы вы хотели вернуть, если ваш персонаж был равен среднему символу?

Кроме того, вы должны убедиться, что все пути могут быть достигнуты вашим алгоритмом. При каких условиях True будет возвращена вашей функцией?

5
ответ дан Madison May 26 August 2018 в 19:25
поделиться

Я думаю, что этот код может работать правильно, просто я отсортировал строку перед проверкой символа 'm':

def isitIn(char, aStr):
b = ''
if aStr == '':  # Check for empty string
    return False
b = sorted(aStr)
m = b[len(b) // 2]
if char == m:
   return True
elif len(b) == 1:
    return False
elif char < m:
       return isitIn(char, b[:len(b) // 2])
else:
       return isitIn(char, b[len(b) // 2:])
return isitIn(char, aStr)
0
ответ дан Mukhtar Edris 26 August 2018 в 19:25
поделиться

это тоже работает. немного короче:

def isIn(char, aStr):
    if len(aStr)==0:
        return False
    elif len(aStr)==1:
        return char == aStr
    elif char == aStr[len(aStr)//2]:
        return True
    else:
        if char < aStr[len(aStr)//2]:
            return isIn(char, aStr[0:len(aStr)//2])
        elif char > aStr[len(aStr)//2]:
            return isIn(char, aStr[len(aStr)//2:]) 
    return isIn(char, aStr)
1
ответ дан xmcp 26 August 2018 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: