파이썬

[재귀함수] 개념, 알고리즘 코드

주니코니 2023. 7. 29. 12:25

[재귀함수란?]

(안에 몇개가 들어가있는지 모르는) 마트로시카~! 🌟🌟

출처 : 빅리더 알고리즘 특강 PPT

1) 1~N까지의 합 

함수 사용해서 표현해보면?

def Func(N):
    ret =0
    for i in range(1,N+1):
        ret += i
    return ret

print(Func(10))

이를 재귀함수로 표현해보면? (코드 대체로 재귀함수로 다 표현 가능)

def Func(N): #큰 오뚜기(Func(N))는
    if N <= 0: #0이거나 음수일 때
        return 0 #뱉어주다
    return N + Func(N-1) #Func(N-1) 작은오뚜기
print(Func(5))

 

왜 ? 

Func(0) = 

Func(-1) = 0

왜 ? 더하기는 0에서부터 시작하니까


2) 1~N까지의 곱

함수 사용해서 표현해보면?

def Func(N):
    ret =1
    for i in range(1,N+1):
        ret *= i
    return ret

print(Func(10))

이를 재귀함수로 표현해보면?

def Func(N):
    if N <= 0:
        return 1
    return N * Func(N-1)

print(Func(5))

Func(0) = 1

Func(-1) = 1

왜 ? 곱은 1부터 시작하니까


[수열이란?]

숫자를 일렬로 나열

 

피보나치 수열

1 1 2 3 5 8 13 21 34

앞의 앞 뒤 더한 숫자 

 

점화식

항과 항 간의 관계 표현하는 식

 

피보나치 수열을 점화식으로 표현하면?Fn(N) = Fn(N-1) + Fn(N-2)

=> 컴퓨터 입장에서는 재귀함수와 똑같다

 

재귀함수로 표현해보면

def Func(N):
    if N==1 or N ==2:
        return 1
    return Func(N-1) + Func(N-2)

for i in range(1,10):
    print(Func(i),end=' ')
#1 1 2 3 5 8 13 21 34

[재귀함수를 알고리즘에 적용해보면?]

재귀함수 - 부르트포스 문제에서 쓰기 추천! (모든 경우의 수를 계산해야할 때)

ex 로또문제

1) 일반 함수로 표현해보면 

# 로또 : 번호 7개 중 6개씩 추출하는 경우의 수
def Fn(lotto_list=[1,2,3,4,5,6,7]):
    #lotto_list =[1,2,3,4,5,6,7]
    #idx          0,1,2,3,4,5,6
    for idx in range(len(lotto_list)-1,-1,-1): #(인덱스 길이:6,-1,-1)
        #print(idx,lotto_list[idx]) #확인해보고 가기
        lotto_list_tmp = lotto_list.copy()
        lotto_list_tmp.pop(idx)
        print(lotto_list_tmp)
#k개 중에 6개를 뽑아라 > '생각을 바꿔서 ' k개 중에 2개를 뽑아보자
def Fn(lotto_list=[1,2,3,4,5,6,7]):
    n =len(lotto_list)
    for idx in range(n):# 나와
        for jdx in range(idx+1,n): #나보다 1 큰 애  뽑기
            print(lotto_list[idx],lotto_list[jdx])

2) 재귀함수로 표현해보면

10중,20중,(무한대) for문도 다음 4줄로 구현 가능하다!

lotto_list = [1,2,3,4,5,6,7]
ret_list = [0,0,0,0,0,0]
N =len(lotto_list)

def Fn(depth,idx):
    # for 6개 이면 끝내줘! #안정해지면 while문처럼 무한대로 돌아
    if depth == 6:
    	#print(ret_list)
        return
    for jdx in range(idx,N):
        ret_list[depth] = lotto_list[jdx]
        Fn(depth+1,jdx+1)
#Fn(0,0)

 

*마트로니카를 떠올려보세요! 

출처 : 빅리더 알고리즘 특강 PPT