-
31.4 연습문제 : 재귀호출로 회문 판별하기코딩도장 심사문제모음 2020. 11. 4. 13:18728x90
다음 소스 코드를 완성하여 문자열이 회문인지 판별하고 결과를 True, False로 출력되게 만드세요. 여기서는 재귀호출을 사용해야 합니다.
첫 접근 방법
연습문제 치고는 여러웠다.
힌트를 봐야만 실마리를 잡을 수 있었다.
사실 회문을 왜 재귀호출로 판별해야하는지는 이해가 가질 않는다.
또한, 이전에 배웠던 index 슬라이싱을 이용해야 한다는 점에서 다시 한번 인지되어 좋은 문제였다.
풀이
## 해당 함수는 True or False 두가지 값을 반환해야하므로 재귀호출을 중지시켜주는 조건이 2개가 필요하다
def rrr (word): if len(word) < 2: return True elif word[0] != word[-1]: return False else: return rrr(word[1:-1]) print(rrr('level')) :: True
def rrr (word): if len(word) < 2: return True if word[0] != word[-1]: return False return is_palindrome(word[1:-1]) ## 코딩 도장 답안
조건문1을 하나씩 살펴보자
def rrr (word): if len(word) < 2: return True
if len(word) < 2
==> 인수로 주어지는 문자열의 길이가 2 미만으로 될때라는 뜻으로
재귀호출을 중지하는 조건 중 하나이다.
회문을 판별하는 과정에서 해당 조건문으로 호출되어 되돌아오는 경우는 결국 회문이라는 이야기이며
해당 회문의 길이가 2 미만, 즉 비교대상이 없을때 반환값 True를 준다.
## 여기서 리턴 값을 주지 않으면 후에 출력 결과가 None으로 나오게 된다.
## 함수가 완료되었을때의 반환 값으로 줘야 우리가 확인이 가능하기 때문이다.
조건문2를 살펴보자
def rrr (word): if len(word) < 2: return True if word[0] != word[-1]: return False
if word[0] != word[-1]:
==> 인수로 주어진 문자열의 인덱스 번호를 이용하여
맨처음 문자열의 인데스 0번과 맨 뒤의 문자열의 인덱스 -1을 비교한다.
해당 여기서 회문이 아닐 경우 바로 반환값 False로 끝나며 아래 rrr 함수를 호출하지 않는다.
def rrr (word): if len(word) < 2: return True if word[0] != word[-1]: return False return is_palindrome(word[1:-1]) ## 코딩 도장 답안
만약 두 값이 같을 경우
==> ex : level ==> 인덱스 0번 == " l " , 인덱스 -1번 == " ㅣ" 이 같을 경우
return rrr (word[1:-1])
rrr 함수를 재귀호출하여 길이가 2미만이 될때까지 계속 재귀호출이 이어지는지 검증한다.
여기서 해당 문제의 키포인트는 재귀호출의 인수(?)라고 생각된다.
## 재귀호출이 일어나는 경우 는 곧, 회문일 가능성이 있으며 위의 조건문을 통해 지속적으로 비교가 가능해야한다.
## 여기서 rrr함수의 word[1:-1] 값으로 다시 rrr을 재귀호출 시키는데,
word[1:-1] ==> index slicing으로 word의 인덱스 2 ~ -2까지 원하는 부분만 자르겠다는 의미이다.
ex : level ==> word[1:-1] == eve 가 된다.
## 여기서는 return 을 통해 재귀호출을 시키는 이유는
word 값에따라 계속해서 회문을 판별해야하기 때문으로 보인다.
728x90'코딩도장 심사문제모음' 카테고리의 다른 글
32.4 연습문제: 이미지 파일만 가져오기 (0) 2020.11.05 31.5 심사문제 : 재귀호출로 피보나치 수 구하기 (0) 2020.11.04 30.7 심사문제 : 가장 낮은 점수, 높은 점수와 평균 점수를 구하는 함수 만들기 (0) 2020.11.03 30.6 연습 문제 : 가장 높은 점수를 구하는 함수 만들기 (0) 2020.11.03 29.4 심사문제 : 사칙 연산 함수 만들기 (0) 2020.11.02