코딩도장 심사문제모음

31.4 연습문제 : 재귀호출로 회문 판별하기

codermun 2020. 11. 4. 13:18
728x90
반응형

다음 소스 코드를 완성하여 문자열이 회문인지 판별하고 결과를 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
반응형