2011-11-01 3 views
1

Я пытаюсь выяснить, как написать рекурсивную функцию (только с одним параметром), которая возвращает количество раз, когда в строке появляется подстрока «ou». Там, где я запутался, мне не разрешено использовать какие-либо встроенные строковые функции, отличные от len, или строковые операторы [] и [:] для индексирования и сращивания. Поэтому я не могу использовать найти встроенные функции поискаВедение подсчета в рекурсивной функции

Я помню, что-то вроде этого, но он использует два параметра, и он также использует метод Find()

def count_it(target, key): 
    index = target.find(key) 
    if index >= 0: 
    return 1 + count_it(target[index+len(key):], key) 
    else: 
    return 0 
+3

Какой может быть спор? Вам разрешено проходить в кортеж? –

ответ

2

Очень неэффективный, но должны работа:

def count_it(target): 
    if len(target) < 2: 
     return 0 
    else: 
     return (target[:2] == 'ou') + count_it(target[1:]) 

Смотреть это работает онлайн: ideone

это в основном та же идея, как код, который вы в курсе, за исключением того, что он движется только один символ в то время через строку вместо того, чтобы использовать find, чтобы перейти к следующему матчу.

+0

Работает! Я всего лишь новичок, но почему бы вам сказать, что он неэффективен? –

+0

@Will S: Основная проблема заключается в том, что 'x [1:]' требует копирования всей строки (кроме первого символа). Это дает сложность O (n * n). –

0

Попробуйте, это работает для общего случая (любое значение ключа, а не только «НУ»):

def count_it(target, key): 
    if len(target) < len(key): 
     return 0 
    found = True 
    for i in xrange(len(key)): 
     if target[i] != key[i]: 
      found = False 
      break 
    if found: 
     return 1 + count_it(target[len(key):], key) 
    else: 
     return count_it(target[1:], key) 

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

  • Нет связанных вопросов^_^