2014-12-07 1 views
0

В следующем коде я попытался сделать рекурсивную функцию для поиска подстрок заданной строки.Глобальные переменные и рекурсия в python

i = 0 
j = 0 
def substrings(string): 
    global i, j 
    if j == len(string) - 1 or len(string) == 0: 
     return [] 
    elif i == len(string): 
     j = j + 1 
     i = j + 1 
     return [string[j:i]] + substrings(string) 
    i += 1 
    return [string[j:i]] + substrings(string) 


>>> substrings('ceng') 
>>> ['c', 'ce', 'cen', 'ceng', 'e', 'en', 'eng', 'n', 'ng', 'g'] 

Я всегда стараюсь использовать глобальные переменные при работе с рекурсиями, и мне это совсем не нравится. Есть ли что-нибудь, что я могу сделать, чтобы не использовать глобальные переменные в этом случае? Я знаю, что могу передавать переменные функции в качестве параметров, но это не работает для меня, так как функция должна иметь только один параметр.

Кроме того, если есть способ сделать это без какой-либо переменной, я бы тоже хотел это узнать.

+1

Почему бы вам не добавить еще один параметр подстроки? Смущенный вашим утверждением «имеет значение» – Duniyadnd

+0

@Duniyadnd Предполагается, что в функции должен быть только один параметр, то есть сама строка. Это просто ограничение. – user2694307

ответ

2

Если вы не хотите, чтобы добавить какие-либо параметры функции, вы можете вложить вторую функцию в нем:

def substrings(string): 
    index= 0 
    length= len(string)+1 
    result= [] 

    def substrings(string, index): 
     if index==length: 
      return 

     for i in xrange(index+1, length): 
      result.append(string[index:i]) 
     substrings(string, index+1) 
    substrings(string, index) 

    return result 
+0

На данный момент мы не используем никакие итерационные инструменты (например, для или в то время), но у меня появилась идея, что я могу определить внутреннюю функцию. Спасибо. – user2694307

0

Это что-то вроде этого вариант?

def substrings(string, i=0, j=0): 
if j == len(string) - 1 or len(string) == 0: 
    return [] 
elif i == len(string): 
    j = j + 1 
    i = j + 1 
    return [string[j:i]] + substrings(string, i, j) 
i += 1 
return [string[j:i]] + substrings(string, i, j) 

>>> substrings("ceng") 
['c', 'ce', 'cen', 'ceng', 'e', 'en', 'eng', 'n', 'ng', 'g'] 

Вам не нужно указывать параметр, но вы можете. ^^

+0

Являются ли такие, как дополнительные параметры? Вы полностью избегаете глобальных перемен, и спасибо за это, но я также хочу знать, есть ли способ сделать это без какой-либо переменной или параметра? Может быть, что-то со списком? – user2694307

0

Та же функция без рекурсии и глобальных переменных:

def substrings(s): 
    return [s[i:j] for i in xrange(0, len(s)) 
      for j in xrange(i+1, len(s)+1)] 

С рекурсии вы, вероятно, потребуется какое-то внутреннее состояние вашей функции, которые должны быть переданы по дополнительным параметрам. Вы определенно можете вычислить две переменные for-loop i и j, используя только длину возвращаемого списка, но это было бы загадочным и не очень читаемым.

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