재귀함수 Recursive function
재귀함수 (Recursive function)
재귀
-
할머니의 비밀상자가 존재한다. 상자를 열어보니 또 안에 많은 상자가 존재한다. 그 중 하나에 키가 있다고 한다면…
-
첫번째 (While)
-
내부를 확인할 상자를 쌓아놓는다.
-
상자를 하나 집어서 내부를 살핀다.
-
만약 안에 상자가 있다면 꺼내어 나중에 확인할 상자 더미에 놓는다.
-
만약 열쇠가 있으면 작업 종료.
-
반복한다.
def look_for_key(main_box): pile = main_box.make_a_pile_to_look_through() while pile in not empty: box = pile.grab_a_box(): for item in box: if item.is_a_box(): pile.append(item) else: print("열쇠를 찾았다.")
-
-
두번째 (Recursive function)
-
상자 안을 확인한다.
-
만약 상자를 발견하면 1단계로 간다.
-
만약 열쇠를 발견하면 작업 종료.
def look_for_key(box): for item in box: if item.is_a_box(): look_for_key(item) # 반복수행 else: print("열쇠를 찾았다.")
-
기본 단계와 재귀 단계
-
재귀 함수의 경우 자기 자신을 호출하기 때문에 무한 반복 에러를 범하기 쉽다.
def countdown(n): print(n) countdown(n-1) countdown(3) ## 결과 3 2 1 0 -1 -2 ....
-
재귀 함수를 만들때는 언제 멈출지 알려줘야한다.
-
기본 단계와 재귀 단계라는 두부분으로 나누어져 있다.
def countdown(n): print(n) if n <= 1: # 기본단계 return else: # 재귀단계 countdown(n-1)
스택 (Stack)
- 프로그램에서 아주 중요한 개념 중 하나.
- TODO List 를 생각해보면 이전 포스팅에서 배웠던 [배열]과 [리스트]에 적용 한다고 생각해보면 될 것이다.
- 할 일을 넣고 빼고, PUSH, POP 기능을 수행하는 것.
호출스택
- 컴퓨터는 호출 스택이라는 불리는 스택을 사용한다. 아래의 코드를 보면 이해가 빠르다.
def greet(name):
print("hello " + name)
greet2(name)
print("getting ready to say good bye!")
bye()
def greet2(name):
print("how are you, " + name)
def bye():
print("ok bye!")
# 수행 순서(메모리 입력순서)
# push(greet("mark")) -> "hello mark" -> push(greet2("mark")) -> "how are you, mark"
# -> pop(greet2("mark")) -> greet실행으로 복귀 -> "getting ready to say good bye"
# -> push(bye()) -> "ok bye" -> pop(bye()) -> greet 으로 복귀 -> pop(greet("mark"))
- 여러 개의 함수를 호출하면서 함수에 사용되는 변수를 저장하는 스택을 호출 스택이라고 한다.
재귀 함수에서 호출 스택 사용
- 재귀함수에서도 호출 스택을 사용한다.
- 예) 팩토리얼 함수.
def factorial(x):
if x == 1:
return 1
else:
return x * factorial(x-1)
# factorial(3) => 3 -> 3 x 2 -> 3 x 2 x 1 Stack에 쌓이고 연산