재귀함수
-
기본 단계 : 함수가 자기 자신을 다시 호출하지 않는 경우(무한 루프에 빠지지 않게 하는 부분)
-
재귀 단계 : 함수가 자기 자신을 호출하는 부분.
-
재귀 함수가 무한히 실행되면 스택 오버플로우가 발생.
func countdown(_ i:Int) {
print(i)
if i <= 1 {
return // 기본단계
} else {
countdown(i-1) // 재귀단계
}
}
스택
- 푸시와 팝이라는 두가지 연산이 존재.
호출 스택
-
여러 개의 함수를 호출하면서 함수에 사용되는 변수를 저장하는 스택
-
모든 함수 호출은 호출 스택을 사용.
-
호출 스택이 너무 커져서 메모리를 많이 사용하게 될 수 있음.
* 스택이 너무 커지면 많은 메모리를 사용하게 된다. 이를 해결하기 위해 재귀 대신 반복문을 사용하거나 꼬리 재귀를 사용한다.
func greet(_ name:String) {
print("hello, \(name)!")
greet2(name)
print("getting ready to say bye...")
bye()
}
func greet2(_ name:String) {
print("how are you, \(name)?")
}
func bye() {
print("ok bye!")
}
재귀 함수에서 호출 스택 사용 펙토리얼 코드
func fact(_ x:Int) {
if x==1 {
return 1
} else {
return x*fact(x-1)
}
}