반응형
Notice
Link
스택큐힙리스트
파이썬 문자열 재귀, 문자열 인덱스가 범위를 벗어나고 있습니다. 본문
반응형
나는 파이썬을 처음 시작했고 재귀적인 방식으로 생각하는 데 매우 서툴러요. 이 코드는 IndexError: string index out of range
오류를 발생시킵니다. 그리고 어떻게 수정해야 할지 감이 전혀 안 와요.
def get_permutations(sequence):
def permutationhelp(sequence, chosen):
if sequence==:
print(chosen)
else:
for i in range(len(sequence)):
c = sequence[i]
chosen += c
sequence = sequence[i+1:]
permutationhelp(sequence, chosen)
sequence = c + sequence
chosen = chosen[:-1]
def permutation(sequence):
permutationhelp(sequence, )
return permutation(sequence)
예시:
get_permutations('abc')
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
추적 내역은 다음과 같아요:
마지막 호출 위치 추적 (가장 최근 호출부터):
파일 soRecursivePermutations.py, 25번째 줄, <module> 안에서
get_permutations('abc')
파일 soRecursivePermutations.py, 23번째 줄, get_permutations 안에서
return permutation(sequence)
파일 soRecursivePermutations.py, 20번째 줄, permutation 안에서
permutationhelp(sequence,)
파일 soRecursivePermutations.py, 12번째 줄, permutationhelp 안에서
c= sequence[i]
문자열 인덱스가 범위를 벗어났습니다.
답변 1
Traceback가 발생하는 이유는 다음과 같습니다:
sequence=sequence[i+1:]
permutationhelp(sequence,chosen)
sequence=c+sequence
첫 번째 줄은 sequence
를 문자열의 끝만으로 남기고 끝내게 됩니다. 그리고 세 번째 줄은 sequence
에 한 글자만 다시 추가하기 때문에, sequence
는 반복문을 통해 계속해서 줄어들게 됩니다.
하지만, 이것은 아마도 찾고 있는 프로그램일 것입니다:
# https://stackoverflow.com/a/53088155/4834
def remove_at(i, s):
return s[:i] + s[i + 1:]
def permutationhelp(sequence, chosen, collect):
if sequence == :
collect.append(chosen)
else:
for i,c in enumerate(sequence):
permutationhelp(remove_at(i, sequence), chosen + c, collect)
def get_permutations(sequence):
collect = []
permutationhelp(sequence, , collect)
return collect
print(get_permutations('abc'))
출력:
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
답변 2
주제: 파이썬에서의 문자열 재귀, 문자열 인덱스가 범위를 벗어나는 문제직접 짜인 코드는 컴퓨터 프로그래밍에서 매우 중요한 부분이다. 그러나 프로그래밍을 하다보면 여러 가지 오류가 발생할 수 있다. 오늘은 파이썬에서 문자열을 다룰 때 발생할 수 있는 실수 중 하나인 문자열 인덱스가 범위를 벗어났다는 오류에 대해 알아보고자 한다.
문자열을 조작하는 동안 문자열 인덱스가 범위를 벗어나는 문제는 많은 프로그래머들이 경험한 적이 있을 것이다. 이 문제가 발생하는 이유는 주로 재귀적인 함수를 작성할 때 자주 발생하지만, 잘못된 인덱스를 참조하는 다른 상황에서도 발생할 수 있다.
예를 들어, 다음과 같은 재귀 함수가 있다고 가정해보자:
```python
def process_string(string):
if len(string) == 0:
return
else:
return string[0] + process_string(string[1:])
```
위의 코드에서 우리는 주어진 문자열의 가장 앞글자를 받아온 후, 재귀를 통해 나머지 부분에 대해 동일한 과정을 반복한다. 그러나 어떤 경우에서는 우리가 처리하려는 문자열이 비어있을 수도 있다. 이럴 때, 문자열의 길이가 0이 되기 때문에 함수는 빈 문자열을 반환한다.
문제는 마지막 부분에서 발생한다. 재귀적으로 함수를 호출할 때, 우리는 문자열을 자르고 그 다음 문자부터 처리해야 한다. 그러나 우리는 이미 모든 문자를 처리했지만 함수를 다시 호출하고 있기 때문에 오류가 발생한다. 이때문에 string index out of range 오류가 발생하는 것이다.
이러한 문제를 해결하기 위해서는 문자열의 길이를 체크하고 재귀를 호출하기 전에 해당 문자열 조각이 비어있는지 확인해야 한다. 예를 들면 이렇다:
```python
def process_string(string):
if len(string) == 0:
return
elif len(string) == 1:
return string[0]
else:
return string[0] + process_string(string[1:])
```
위의 코드에서 첫 번째 문자를 가져오는 것과 이후의 문자열을 처리하는 재귀 함수를 호출하기 전에, 문자열의 길이가 1이면 첫 번째 문자만 반환하도록 처리했다. 이렇게 하면 마지막 재귀 호출에서 오류가 발생하지 않는다.
문자열 인덱스가 범위를 벗어나는 문제는 파이썬 프로그래밍을 하다보면 자주 마주치는 실수 중 하나이다. 이를 해결하기 위해서는 문자열의 길이를 체크하고 예외 상황에 대비하는 것이 필요하다. 이처럼 주의해야 할 부분도 중요하지만, 프로그래밍에서의 문제해결 능력은 지속적인 연습과 경험을 통해 향상시킬 수 있다.
다음 번에 파이썬으로 문자열을 다룰 때, 문자열 인덱스가 범위를 벗어났다는 오류를 만났을 때 이 글을 통해 우리가 어떻게 해결할 수 있는지 상기시켜보자. 프로그래밍을 할 때 오류가 발생하는 것은 흔한 일이며, 그러한 오류를 통해 배움과 성장할 수 있다는 것을 명심해야 한다.
반응형
Comments