본문 바로가기
교육은 한 사람의 인생을 바꾼다/AI교육

완전 초짜 파이썬 : 함수(재귀함수)

by 함께 만드는 블로그 2020. 12. 5.
반응형

>>재귀함수 활용하기

예제 재귀함수를 이용해 1에서 n까지 더하는 입출력문을 만들어라.
결과물
코딩 def findSum(n):
    if n==1:
        return 1

    else:
        return n+findSum(n-1)


a=input('숫자 입력:')
a=int(a)

print(findSum(a))

 : 재귀함수(순환함수)란 자기 자신을 호출하여 순환 수행되는 함수이다. 

 : 한 작업을 통째로 해결하는 것이 아닌, 같은 유형의 하위 작업으로 분할하여 해결하는 방법이 효율적일 경우 사용한다,

 : 위의 경우처럼 1에서 n까지 더하는 반복작업을 재귀함수를 활용해 쉽게 해결할 수 있다.  

 

 

 

>>위의 재귀함수 응용하기

예제

1부터 N까지 곱하는 N!(N펙토리얼) 함수를 만들어보기

결과물

코딩

def factorial(n):
    if n==1:
        return 1

    else:
        return n*factorial(n-1)


a=input('펙토리얼 숫자 입력:')
a=int(a)

print(factorial(a))

 : 자기 자신을 호출하는 부분만 바꿔주면 아주 간단하게 펙토리얼도 구현할 수 있다.

 

 

>>위의 재귀함수 응용하기2

예제

1부터 N까지 곱하는 N!(N펙토리얼) 함수를 함수 호출과 반환의 과정을 포함해 만들어 보기

결과물

코딩

def fact(n):
    if n==1:
        print('fact','(',n,')','함수','호출')
        return 1, print('fact','(',n,')','값',n,'반환')

    else:
        print('fact','(',n,')','함수','호출')
        return n*fact(n-1), print('fact','(',n,')','값',check(n),'반환')

def check(n):
    if n==1:
        return 1

    else:
        return n*check(n-1)

n=input('정수를 입력하세요: ')
n=int(n)
print()

fact(n)
print()

print(n, '의 팩토리얼 값은', check(n), '입니다')

 : 이번 예제가 가장 어려웠다. 결국 비슷한 내용의 함수를 2개 써서 문제를 해결했다. 2개의 함수를 쓰지 않고, 위의 fact(n) 함수만 어떠케 잘 바꾸면 될것 같기도한데.... 아무리 생각해도 모르겠어서 그냥 함수 2개를 사용했다. 

 : 이 예제의 요지는 재귀함수의 경우 하위 함수를 호출하고 가장 하위함수로부터 값을 하나씩 반환 받는 과정을 거치게 된다는 것. 이 부분을 이해하는 것이 재귀함수의 핵심이다.

 

 

>>재귀함수로 피보나치수열 구하기

예제

피보나치 수열: 1, 1, 2, 3, 5, 8, 13 .....  >> 앞의 두 수열의 합이 다음 수열의 값이 되는 수열

결과물

코딩

def fibo(n):
    if n==1:
        return 1
    if n==2:
        return 1
    else:
        return fibo(n-2)+fibo(n-1)  

x=input('피보나치 수열의 몇 번째 수를 알고 싶나요? ')
x=int(x)


print(fibo(x))

 : 1항과 2항의 값을 고정하고, 그 외 나머지(else)는 그 전전항과(n-2) 그 전항(n-1)을 호출할 수 있도록 코딩하면 완성!

 

 

 

>>재귀함수로 하노이의 탑 문제 풀기

예제

하노이 탑의 원판의 개수를 n개, 원봉을 A, 목적봉을 C, 임시봉을 B 라고 가정했을 때, 하노이의 탑의 원판들을 움직이는 방법을 나타내는 재귀함수를 만들어 보자.

결과물

코딩

def hanoi(n,원봉,목적봉,임시봉):
    if n==1:
        print('원판',n,'을',원봉,'에서',목적봉,'으로 옮겨라')

    else:
        hanoi(n-1,원봉,임시봉,목적봉)
        print(원봉,'에 디스크',n,'을', 목적봉,'으로 옮겨라')
        hanoi(n-1,임시봉,목적봉,원봉)

x=input('원판은 총 몇개입니까?')
x=int(x)

hanoi(x,'A','C','B')

 : 하노이의 탑의 핵심인 같은 움직임이 단계마다 반복되는 특징은 재귀함수로 풀기 딱 좋은 특징이다. 두번의 재귀함수 사용을 통해 하노이의 탑을 해결하기 위한 방법을 출력하는 코딩을 만들 수 있다. 

 : 다만 내 비루한 실력으로는 재귀함수를 이해하기가 참 힘든 것 같다 ㅠㅠ 정확히 어떤 부분에서 재귀함수를 사용하면 좋은지에 대한 감이 없다..... 그 부분은 많은 연습이 필요할 것 같다.

반응형

댓글