👀 재귀란?
: 어떠한 것을 정의 할 때 자기 자신을 참조하는 것을 말한다.
👀 재귀함수란?
: 자기 자신을 호출하는 함수이다.
👉 예시를 들어서 설명을 하자면
어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었습니다.
🥺 "재귀함수가 뭔가요?"
🥸 "잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
그의 답은 대부분 옳았다고 하네.
그런데 어느날, 그 선인에게 한 선비가 찾아와서 물었어.
🥺 "재귀함수가 뭔가요?" "
🥸 잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을...
그렇다면 재귀 함수를 사용하는 이유는 무엇일까요??
바로, 재귀 함수를 이용해서 간결하고 효율성 있는 코드를 작성하기 위해서 입니다!
예를 들어 12월 31일 11시 59분
보신각에 모여 사람들이 카운트 다운을 하기 시작했습니다.
그래서 60부터 0까지 사람들이 숫자를 외칩니다.
이 예시를 코드로 작성 해보면 다음과 같습니다.
def count_down(number):
print(number) # number를 출력하고
count_down(number - 1) # count_down 함수를 number - 1 인자를 주고 다시 호출한다!
count_down(60)
위처럼 코드를 짜면 끝도 없기 반복하기 때문에 오류가 발생합니다!
def count_down(number):
if number < 0: # 만약 숫자가 0보다 작다면, 빠져나가자!
return
print(number) # number를 출력하고
count_down(number - 1) # count_down 함수를 number - 1 인자를 주고 다시 호출한다!
count_down(60)
그렇기 때문에 재귀 함수를 사용 할 때는 꼭! 탈출 조건을 설정 해줘야 합니다.
재귀 함수를 활용하여 팩토리얼과 회문 검사를 풀어 보도록 하겠습니다.
[팩토리얼]
: 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 의미합니다.
예를 들어서 3!은 3*2*1 = 6, 4!은 4*3*2*1 = 24
즉, Factorial(n) = n * Factoiral(n-1) Factoiral(n-1) = (n-1) * Factoiral(n-2)로 표현 할 수 있습니다.
어딘가 반복되는 구조이기 때문에 재귀함수를 사용하면 코드를 효율성 있게 구현 할 수 있습니다!
def factorial(n):
fac = n * factorial(n-1)
return fac
처음에는 이렇게 코드를 짰는 데 오류가 발생했다.
이유를 생각 해보니 가장 중요한 탈출 조건이라는 걸 설정하지 않았기 때문에 오류가 난 것이다.
다시 코드를 짜보면
def factorial(n):
if n == 1:
return n # or return 1
fac = n * factorial(n-1)
return fac
if문을 사용해서 n이 1이 되면 return 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))
위 코드에서 string[1:-1]은 문자열 슬라이싱을 사용한 코드입니다
[시작 값 : 끝 값]을 사용하면 문자열을 시작 값에서 끝 값까지만 잘라서 반환 해줍니다.
'항해 중 > 알고 보면 알기 쉬운 알고리즘' 카테고리의 다른 글
스택, 큐 (0) | 2021.11.13 |
---|---|
정렬 - 버블정렬, 선택정렬, 삽입정렬 (0) | 2021.11.13 |
이진 탐색, 순차 탐색 (0) | 2021.11.13 |
클래스, 객체, 생성자, 메소드 (0) | 2021.11.13 |
Array(배열), Linked List(리스트), 둘의 차이점 (0) | 2021.11.13 |
댓글