재귀함수 종료조건
11
작성한 질문수 2
안녕하세요. 재귀함수로 팰린드롬을 구현하는 부분을 공부하고 있습니다.
예제 코드를 보다가 한 가지 궁금한 점이 생겼습니다.
def is_palindrome(string):
if string[0] != string[-1]:
return False
if len(string) <= 1:
return True
return is_palindrome(string[1:-1])이 경우 빈 문자열 ""이 들어오면 string[0]에서 IndexError가 발생할 수 있을 것 같은데, 아래처럼 종료 조건을 먼저 작성하는 것이 더 안전한 방식이 맞을까요?
def is_palindrome(string):
if len(string) <= 1:
return True
if string[0] != string[-1]:
return False
return is_palindrome(string[1:-1])재귀함수에서 종료 조건을 먼저 두는 것이 일반적인 원칙인지도 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
운머님, 질문하신 것처럼 string[0]과 string[-1]]을 확인하기 전에 문자열 길이를 먼저 검사하는 방식이 더 안전합니다.
빈 문자열 ""에서는 string[0]에 접근할 수 없기 때문에 IndexError가 발생합니다. 따라서 다음과 같이 종료 조건을 먼저 두는 것이 적절합니다.
def is_palindrome(string):
if len(string) <= 1:
return True
if string[0] != string[-1]:
return False
return is_palindrome(string[1:-1])
재귀 함수에서는 일반적으로 재귀 호출보다 기저 조건(base case)을 먼저 검사하는 방식이 권장됩니다. 이렇게 하면 더 이상 재귀를 진행할 필요가 있는지 먼저 판단할 수 있고, 빈 문자열이나 길이가 1인 문자열처럼 인덱스 접근이 안전하지 않은 경우도 방지할 수 있습니다.
회문 검사는 양 끝 문자를 비교한 뒤, 양 끝을 제거한 부분 문자열에 대해 같은 검사를 반복하는 방식입니다. 문자열 길이가 0 또는 1이 되면 더 이상 비교할 문자가 없으므로 회문으로 판단하면 됩니다.
관련 답변은 아래 게시글을 참고해 주세요.
해당 답변에서도 회문 검사에서 문자열의 앞과 끝을 비교하며 진행하는 재귀 구조와, 문자열의 가운데까지 비교하면 충분한 이유를 설명하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
링크드 리스트 중간 삽입삭제 시간복잡도 질문
0
9
1
백준 사이트 준비중이라 문제를 볼 수 가 없어요
0
30
1
해당 차수 영상이 짤려 나갑니다
0
46
1
1-11 소수 나열하기 (에라토스테네스의 체)
0
66
1
수강평 이벤트
0
92
2
코딩테스트 처음인데 이런 공부방법이어도 괜찮을까요
0
178
2
3-3 정렬-2 선택정렬 로직
0
80
2
링크드 리스트 끝에서 k번째 값 출력하기
0
75
2
LinkedList 과제 Fast, slow 포인터
0
72
2
투포인터 시간복잡도
0
87
2
수강평 작성 후 자료
0
79
2
수업교재 링크 오류
2
144
2
프로그래머스에서 제출 후 채점시 틀림ㅠ
0
190
2
1-10 알고리즘 더 풀어보기(2) 질문 있습니다
0
107
2
문제 풀이 방식 관련 질문입니다!
0
120
2
1-5 알고리즘과 친해지기 (2) - 최빈값찾기 질문 있습니다
0
126
2
수업자료 pdf 받고싶습니다
0
138
2
강의 자료 오류 수정
0
97
1
2-10 더하거나 빼거나 관련 질문입니다
0
87
2
3-8 해쉬 -2
0
67
2
Linked List Element Delete Explanation Problem
0
94
2
강의3-4 스택 탑 문제
0
103
2
코드스니펫 입출력 케이스에 오류가 있는것 같아요
0
131
3
링크드 리스트 원소 찾기 구현 방식 질문드립니다.
0
105
2





