[알고리즘] 재귀

Boknami·2023년 2월 13일

알고리즘

목록 보기
5/9
post-thumbnail

📝재귀의 개념

재귀함수는 Recursive함수라고도 불리며, 함수 안에서 본인의 함수를 다시 실행시키는 것을 뜻한다.

  • 종료시점, 조건을 잘 고려해서 구현하도록 하자.
  • 재귀 호출이 너무 많은 경우 stack 메모리 영역에 너무 많은 공간이 할당

메모리 영역의 할당

운영체제 시간에 배운 내용도 생각나 복습 겸 메모리 영역에 대한 공부를 간단히 정리하였다.


🤷‍ 재귀는 어디에 사용될까?

  • 팩토리얼 계산

재귀 문제풀이

  • [G5]2447]별 찍기

  • [S5]17478] 재귀함수가 뭔가요?

문제 자체는 크게 어렵진 않았고, 20분 근처로 걸린 것 같다. 조금 곤란했던 부분이 처음에 '____' 가 반복되는 부분을 리컬시브 함수 처음에 print(rep * cnt + '"재귀함수가 뭔가요?"')로 해두니 첫 부분이 띄어쓰기가 적용되어 올바르게 출력이 되지 않은 부분이었다. 해당 부분은 조건문을 통해 처음일 경우는 별개로 처리하고 나머지는 문자열 연결을 +로 바꿔주어 해결하였다. 예전에 이미 푼 기록이 있는 문제였다. 예전 코드를 참고하지 않고 재귀를 통해 풀려고 노력했다. 문제를 해결하고 난 후 예전 코드를 보니 시간도 더욱 걸리고 코드도 재귀보단 for반복문으로 해결하였다.

예전 코드

repeat = int(input())
repeat = repeat + 1

print('어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.')

for i in range(0, repeat):
    if(i == 0):
        print('"재귀함수가 뭔가요?"')
        print('"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
        print('마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
        print('그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')

    else:
        for a in range(0, i):
            print('____', end='')
        print('"재귀함수가 뭔가요?"')

        for b in range(0, i):
            print('____', end='')
        
        if i == (repeat-1):
            print('"재귀함수는 자기 자신을 호출하는 함수라네"')
            break

        print('"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')

        for c in range(0, i):
            print('____', end='')
        print('마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')

        for d in range(0, i):
            print('____', end='')
        print('그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')

for i in range(repeat-1, -1, -1):
    for a in range(0, i):
        print('____', end='')
    print('라고 답변하였지.')

재귀를 이용한 코드

rep = '____'

def recur(end, cnt):
    if(cnt == end):
        return 1
    if(cnt == 0):
        print('"재귀함수가 뭔가요?"')
        print('"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
        print('마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
        print('그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')
        recur(end, cnt + 1)
    else:
        print(rep * cnt + '"재귀함수가 뭔가요?"')
        print(rep * cnt + '"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
        print(rep * cnt + '마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
        print(rep * cnt + '그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')
        recur(end, cnt + 1)

def recur2(cnt, n):
    if(cnt == 0): return
    if(cnt == n):
        print(rep * cnt + '"재귀함수가 뭔가요?"')
        print(rep * cnt + '"재귀함수는 자기 자신을 호출하는 함수라네"')
    print(rep * cnt + '라고 답변하였지.')
    recur2(cnt-1, n)

n = int(input())

print('어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.')
recur(n, 0)
recur2(n, n)
print('라고 답변하였지.')

  • [S1]11729] 하노이탑 이동 순서

  • [G5]1759] 암호 만들기 ← 맞나 재귀?..

  • [G2]23564] 재귀 문자열

0개의 댓글