Attention please

클래스와 재귀함수 본문

알고리즘

클래스와 재귀함수

Seongmin.C 2022. 10. 3. 00:06

앞으로 데이터들을 가지고 연산을 하는 자료구조들을

파이썬으로 구현하고자 할 때

 

클래스를 사용하여 표현합니다.

 

이러한 자료구조들을 구현하기 위해 사용되는 클래스에 대해 알아보겠습니다.

 

 

 

 

 

클래스

클래스란?

객체를 만드는데 필요한 설계도라고 생각하면 됩니다.

 

객체 혹은 인스턴스라 불리는 이것은

설계도인 클래스를 가지고 구현해야할 대상입니다.

 

즉, 클래스에서 정의된 것을 실제 메모리에 구현 한 것입니다.

 

 

 

 


멤버변수(속성)

객체에 정보를 저장

 

메소드

연산수행

 

생성자

객체를 생성하는 특별한 메소드

 

self파라미터

생성된 객체를 참조한다.


 

 

 

저 위에 있는 것들로 클래스는 구현되고 사용됩니다.

 

간단하게 클래스 하나를 만들어보겠습니다.

 

class test: # test:클래스이름
	def __init__(self, input, weight): # 생성자
    	self.input = input
        self.weight = weight
        
	def train(self):
    	output = self.input * self.weight
        return output

 

위와 같이 정말 간단한 아무 의미없는 클래스 test를 만들어보았습니다.

 

이제 객체를 불러오겠습니다.

 

A = test(input = 3, weight = 2)
A.train() # 6 출력

 

이런식으로 객체를 만들어

미리 클래스에서 만들어논 메소드를 불러와 연산수행을 시킬 수 있습니다.

 

 

 

 

 

 

재귀함수

재귀란?

자신을 정의할 때 자기 자신을 참조하는 방법입니다.

 

재귀함수란?

어떤 함수의 내부에서 자기 자신을 다시 호출하는 것입니다.

 

이와 같이 자기 자신을 어떤 함수 내에서 호출하는 것을

재귀호출이라 합니다.

 

코드로 예를 들어보겠습니다.

 

def output():
	output()
    
output()

 

이런식으로 output함수 내에 또 output이 호출되는 이런 함수를

재귀함수라 부릅니다.

 

그렇다면 위 output함수를 실행시키면 어떤 결과가 나올까요?

 

결과는 오류가 나옵니다.

 

재귀함수를 만들 때 중요한 점이 종료조건을 확실하게 내새워야하는 것입니다.

 

위의 output함수는 따로 종료조건 없이

계속 반복적으로 호출되게 설계되어있기에

결국 오류가 나게 됩니다.

 

 

 

 

 

 

구조

 

종료조건

충분히 작아진 문제에 대해서 더는 재귀호출을 하지 않고

직접 해결한다.

 

재귀호출

원래 문제보다 작아진 부분 문제를 대상으로

재귀호출을 한다.

 

 

 

그렇다면 이번에는 위 구조를 충족시켜

재귀함수에 대해 코드를 다시 만들어보겠습니다.

 

def output(n):
	if n == 0:  # 종료조건
    	return
    else:
    	print(n)
        output(n-1)  # 재귀호출
        
# output(3)
# 3
# 2
# 1
#
#

 

위와 같이 3을 집어넣게 되면

종료 조건인 입력값이 0이 되기 전까지

1식 빼지면서 출력을 반복하게 됩니다.

 

 

 

이번에는 팩토리얼 재귀함수를 만들어보겠습니다.

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

 

이런식으로 만들어집니다.

 

n 이 1이 되는 것을 종료조건으로 잡았으며

n 에서 1씩 줄어드는 원래 문제보다 작아진 부분 문제에서

재귀호출이 일어나며 재귀함수가 설계되었습니다.

 

 

 

 

 

반복함수 재귀함수

모든 반복함수는 재귀함수로 바꿀 수 있으며

모든 재귀함수는 반복함수로 바꿀 수 있습니다.

 

 

 

 

물론 서로 장단점이 존재합니다.

 

재귀함수의 장점

코드를 단순하고 직관적이게 설계할 수 있습니다.

또한 재귀함수를 이용하여 큰 문제를 작은 하위 문제들로

나누어 쉽게 풀 수 있습니다.

 

재귀함수는 단점

이해하기 힘들 수 있습니다.

또한 공간복잡도와 시간복잡도에 있어서 비효율적일 수 있습니다.

디버깅이 힘듭니다.

 

 

 

 

 

 

 

 

 

'알고리즘' 카테고리의 다른 글

탐색 알고리즘(선형, 이진, 해시)  (0) 2022.11.11
스택  (0) 2022.10.07
연결리스트  (0) 2022.10.03
리스트와 노드  (0) 2022.10.03
알고리즘 성능평가  (0) 2022.10.02
Comments