Попытка выяснить программу рекурсивного подсчета в Python - PullRequest
0 голосов
/ 20 апреля 2011
def countSubStringMatchRecursive(target,key):
    """Counts how many times key is in string(string,key)"""
    x=find(target,key)
    print x
    return x!=-1 and countSubStringMatchRecursive(target[x+1:],key)+1 

Таким образом, эта программа берет данную строку и подсчитывает, сколько раз подстрока появляется внутри нее. Таким образом, с учетом цели «банан» и клавиши «an» функция выплюнет 2.

Я немного смущен тем, как это происходит. Делает ли x! = 1 так, что программа возвращает только x, не равный единице? Я предполагаю, что +1 в конце countSubStringMatchRecursive ... взамен как-то считает.

Ответы [ 4 ]

2 голосов
/ 21 апреля 2011

Как сказал jhwist, String.find возвращает самый низкий индекс совпадения. Поэтому рекурсия произойдет только в том случае, если подстрока действительно найдена (в противном случае String.find возвращает -1).

Это очень неэффективный способ сделать это. Python поддерживает эту функцию, она называется str.count(sub[, start[, end]]). Документировано здесь: http://docs.python.org/library/stdtypes.html#str.count.

Так что вместо

countSubStringMatchRecursive("test test test test", "test")

вы бы использовали

"test test test test".count("test")
1 голос
/ 21 апреля 2011

x - индекс местоположения найденной подстроки.Если это -1, он не был найден, поэтому метод возвращает 0.

Другими словами, он короткие сокращения и не оценивает второе условие (например, он не 'сделать рекурсивный вызов).В противном случае он рекурсивно вызывает себя, используя позицию найденной подстроки плюс один (поэтому мы можем найти следующую подстроку, если она существует) и добавляет 1 к результату.

0 голосов
/ 21 апреля 2011

Признаюсь, я не знаю много о питоне, но это легко.

Хитрость в том, что последняя строка.

Сначала "return" проверяет, есть лине -1, что означало бы, что текущая рекурсия этой функции не нашла лишний «ключ» в «target», в этом случае условие после «и» не будет оценено, и функция вернет «false» (нулю) к вызывающей функции.

Если «x» действительно не равен -1, однако, вторая часть условия (после «и») будет оценена, и то, что делает этот оператор, вызывает функциюсамо по себе, но отправляет подстроку текущей вычисляемой «цели», начиная с одного символа после «x» (позиция «ключа» в «цели» в текущей рекурсии).Затем он добавляет единицу к значению, возвращаемому функцией, и возвращает сумму.

Итак, последняя рекурсия функции возвращает ноль (false), одна до этого возвращает одну (true), другая до этогоодин возвращает два (true + 1) и т. д.

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

0 голосов
/ 21 апреля 2011

String.find возвращает самый низкий индекс совпадения.Поэтому рекурсия произойдет только в том случае, если подстрока действительно найдена (в противном случае String.find возвращает -1).

...