알고리즘

재귀함수 - 2

na_o 2021. 8. 24. 01:33
728x90

[팩토리얼]

팩토리얼은 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것

5! = 5 * 4 * 3 * 2 * 1

 

Factorial(n) = n * Factorial(n - 1)
Factorial(n - 1) = (n - 1) * Factorial(n - 2)
....
Factorial(1) = 1

 

의 구조임

 

def factorial(n):
    if n <= 1:   # 탈출 방법
        return 1
    return n * factorial(n-1)


print(factorial(5))

# 120

재귀함수는 반복을 빠져나갈 수 있는 방법을 꼭 적어줘야 함!!

 


[회문 검사]

다음과 같이 문자열이 입력되었을 때, 회문이라면 True 아니라면 False 를 반환하시오.

 

회문은 똑바로 읽으나 거꾸로 읽으나 똑같은 단어나 문장

ex) 토마토, 오디오, 아시아, 일요일, 소주만병만주소, ...

 

[회문의 조건]

첫 번째 글자 = 맨 뒤에서 첫번째 글자

두 번째 글자 = 맨 뒤에서 두번째 글자

...

마지막 남은 가운데 글자는 뭐가 오든 상관 없음

 

 

 

방법 1) 

문자열을 돌면서

맨 앞의 문자와 맨 뒤의 문자

맨 앞에서 두번째 문자와 맨 뒤에서 두번째 문자

...

를 비교

input = "abcba"


def is_palindrome(string):
    n = len(string)
    for i in range(n):
        if string[i] != string[n - 1 - i]:
            return False
    return True


print(is_palindrome(input))

# True

 

[내가 만든 코드]

input = "abcba"


def is_palindrome(string):
    for i in range(len(string)):
        if string[i] == string[(len(string) - 1) - i]:
            continue
        else:
            return False

    return True


print(is_palindrome(input))

# True

 

 

방법 2)

맨 앞과 맨 뒤를 비교했다면 비교를 완료한 문자들을 모두 제외하고 나머지 남은 그 중간 값들만 비교

is_palindrome("abcba") -> is_palindrome("bcb") -> is_palindrome("c")

-> is_palindrome(string[1:-1])

string[1(첫번째글자):-1(뒤에서첫번째글자)]

 

[탈출 조건]

문자열의 길이가 1보다 작거나 같을 때(문자열이 한글자일 때: 한글자여도 앞으로 읽거나 뒤로 읽어도 같으니 회문임)

-> 

맨 첫번째 문자와 맨 뒤의 문자가 다를 때

-> 거짓

input = "abcba"


def is_palindrome(string):
    if len(string) <= 1:   # 탈출 방법
        return True
    if string[0] != string[-1]:   # 탈출 방법
        return False
    return is_palindrome(string[1:-1])


print(is_palindrome(input))


# True

 

[내가 만든 코드]

input = "abcba"


def is_palindrome(string):
    n = len(string)
    if n <= 1:
        return True
    if string[0] == string[-1]:
        string = string[1:-1]
        return is_palindrome(string)
    else:
        return False


print(is_palindrome(input))


# True

'알고리즘' 카테고리의 다른 글

배달의 민족 배달 가능 여부  (0) 2021.08.26
링크드 리스트 끝에서 K 번째 값 출력하기  (0) 2021.08.26
재귀함수 - 1  (0) 2021.08.23
이진탐색  (0) 2021.08.23
링크드 리스트 문제  (0) 2021.08.22