Data is ___ ?

정의

재귀함수는 함수 안에 함수를 호출하는 함수 (자기 자신을 호출하는 형태)

함수 내에서 그 함수를 다시 사용하는 것

더보기

⚠ return : 함수를 실행했던 위치로 돌아가라, 함수를 여기서 끝내라는 의미

 


주의할점

재귀함수는 자기 자신을 호출하기 때문에, 잘못하면 무한히 호출할 수 있다. 따라서 탈출 조건이 필수이다. 

 

 

 

 

 


예제

간단한 예제

def recursion(n) :
    # n이 0이면 빠져나오기
    if n == 0 :
    	return 0
        
    # n 출력
    print(n)
    
    # 다시 recursion 함수에 n-1 입력
    return recursion(n-1)
----------------------------------------------------------------------------------    
recursion(10)
"""
10
9
8
7
6
5
4
3
2
1
0
"""
def recursion(n):
    if n == 0: 
    	return 0
    a = recursion(n-1)
    print('return',a)
    return a + 1
------------------------------------------------------------------------------
recursion(10)
"""
return 0
return 1
return 2
return 3
return 4
return 5
return 6
return 7
return 8
return 9
10
"""
더보기

💡 위의 코드 설명

✔ 예를 들어 recursion(10)을 받게 되면, a = recursion(9)가 되고, 또 recursion(9)를 받게 되면, a = recursion(8)이 되는 규칙이 반복된다.

 이렇게 해서 recursion(1)을 받으면 a = recursion(0) = 0 (n = 0이면 0을 리턴하므로)이 된다.

 그러면 이제 자연수 a가 나왔으므로 print('return', a) -> return 0 출력

 recursion(1)은 a+1 = 1을 리턴하고 이 함수는 끝난다.

-----------------------------------------------------------------------------------------------------------------------------------

점점 위로 올라가면서 출력하는 형태

recursion(2)를 받으면 a = recursion(1) = 1이므로 return 1을 출력하고, a+1 = 2를 return

recursion(3)을 받으면 a = recursion(2) = 2이므로 return 2를 출력하고, a+1 = 3을 return 

...

...

recursion(10)을 받으면 a = recursion(9) = 9이므로 return 9를 출력하고, a+1 = 10을 return

마지막으로 return한 10까지 출력 후, 끝 !

 

 

def recursion(n):
    print("start",n)
    if n == 0: 
    	return 0
    a = recursion(n-1)
    print('return',a)
    return a + 1
---------------------------------------------------------------------------------
recursion(10)
"""
start 10
start 9
start 8
start 7
start 6
start 5
start 4
start 3
start 2
start 1
start 0
return 0
return 1
return 2
return 3
return 4
return 5
return 6
return 7
return 8
return 9
10
"""
더보기

✔ a = recursion(n-1) 이 코드 때문에 recursion 함수가 1씩 작아지면서 반복적으로 호출되어, start를 모두 출력한다.

 그 후에 recursion(0)이 0으로 return되면서 a값이 구해지고 다시 a+1로 리턴하는 값이 생겨 recursion(1), recursion(2), ... 까지 구할 수 있게 된다. 

 

 


팩토리얼 함수

n = int(input())
def recursion(n) : 
    if n <= 1 :
    	return 1
    return n*recursion(n-1)
    
print(recursion(n))

 

 

 

 


유클리드 호제법

  • 두 값 A, B의 최대공약수를 구하기 위해 사용되는 방법
# 반복문
def recursion(a, b) :
    while a % b != 0 : 
        a, b = b, a % b


# 재귀함수
def recursion(a, b) :
    if a % b == b :
        return b
    return recursion(b, a % b)
    
    
# 파이썬 함수 사용
from math import gcd
gcd(a, b)

 

 

 

 

 


피보나치 수열

  • n번째 값이 (n-2)번째 값 + (n-1)번째 값과 같음을 만족하는 수열
  • 즉, 1, 1, 2, 3, 5, 8, 13, 21, ...
# 반복문 함수 (n번째 항의 값 출력)
def fib(n) :
    p = 0
    c = 1
    for i in range(n-1) :
        t = p
        p = c
        c = p + t
    return c
-----------------------------------------------------------------------
# 재귀함수 (n번째 항의 값 출력)
def recursion(n) :
    if n <= 2 :
        return 1
    return recursion(n-1) + recursion(n-2)
    
for i in range(1, 11) :
    print(recursion(i))

 

 

 

 

 

'Python > 자료구조, 알고리즘' 카테고리의 다른 글

에라토스테네스의 체  (0) 2023.05.02
[파이썬] 약수, 배수, 소수  (0) 2023.04.03
집합과 맵  (0) 2023.04.02
profile

Data is ___ ?

@콩순이컴퓨터

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...