2014-12-07 2 views
0

다음 코드에서 재귀 함수를 만들어 주어진 문자열의 하위 문자열을 찾으려고했습니다.파이썬의 전역 변수와 재귀

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-variables ij을 분명히 계산할 수 있습니다. 그러나 이것은 매우 이해하기 쉽고 그리 읽을 수는 없습니다.

관련 문제