Python: Recursive

0

압축 Python

목록 보기
3/11
post-thumbnail

재귀함수

자기 자신을 호출하는 구조

def func_recursive():
    pass
    ...
    func_recursive()

위의 코드처럼 특정 함수 내부에서 다시 해당 함수를 호출하는 구조를 일컫는다.


대표 예제: Factorial

def factorial(n):
	if n == 0:
		return 1
    else:
    	return n * factorial(n-1)

factorial(3)
>>
3 * factorial(2)
	2 * factorial(1)
    	1 * 1
        	= 6

대표 예제: fibonacci

def fibonacci():
	if n == 1:
    	return 1
    if n == 2:
    	return 1
    else:
    	return fibonacci(n-1) + fibonacci(n-2)
        
fibonacci(5)
>>
	fibonacci(4) + fibonacci(3)
    	(fibonacci(3) + fibonacci(2)) + (fibonacci(2) + fibonacci(1))
        	((fibonacci(2) + fibonacci(1)) + 1) + ( 1 + 1 )
            	(1 + 1 + 1) + (1 + 1)
                	= 5

'아주 예쁜 규칙'이 있으며 '반복작업'이 심각하게 누적되는 경우에 효율적으로 쓸 수 있는 것으로 보인다.

외에도 while( )문과 비슷하게 특정 조건이 만족되지 않는 한 해당 함수를 반복 호출해야 하는 경우에 유용하게 사용할 수 있을 것으로 생각된다.


대표예제: List 자료형 평탄화

list 안의 list를 모두 없애는 작업도 가능하다.

def flatten(data):
    result = []
    
    # checker 변수가 data를 하나씩 훑는다
    for checker in data:
    	# 만약 checker 변수의 자료형이 List로 확인되면
        if type(checker) == list:
        	# checker를 다시 이 함수에 넣어서 보낸다
            # 처음에 들어온 data의 요소를 확인하면서
            # 해당 요소가 list라면 재귀하는 것이다
            result += flatten(checker)
        else:
        	# list가 아니라면 메서드로 list에 추가한다
            result.append(checker)
            
    return result
            
data = [1,[2,3,4],1,2,[3,2,1],2,3,[1,2],3,[5,1],2,[5,9,0],[4,2]]
print(flatten(data))

>> [1, 2, 3, 4, 1, 2, 3, 2, 1, 2, 3, 1, 2, 3, 5, 1, 2, 5, 9, 0, 4, 2]

0개의 댓글