본문 바로가기

반응형

recursion

(3)
최고로 효율적인 반복문을 찾아보자(for, while, recursion) 목적 대부분의 프로그래밍 언어는 세가지(for, while, recursion)의 반복문을 지원하는데, 어느 반복문을 언제 써야 하는지는 명확하게 정해져 있지 않다. 어떤 상황에서 어떤 반복문을 써야 할까? for 반복횟수가 정해져 있다. 특정 조건만큼 반복할수 없다. (if문과 break를 써야 한다) 사용된 값을 다음 반복문에 사용하기 힘들다 for문을 사용하기 좋은 문제 예시: array에 담겨 있는 숫자를 순서대로 출력하기. while 반복횟수가 정해져 있지 않다. 특정 조건만큼 반복할수 있다. 사용된 값을 다음 반복문에 사용하기 힘들다 while문을 사용하기 좋은 문제 예시: 사용자가 타이핑한 단어 수 세기. recursion 스택메모리 크기에 따라 반복횟수가 정해져 있다. 특정 조건만큼 반복할..
꼬리 재귀 함수 정의 재귀함수의 최적화 방법 원리 재귀 함수시, 함수에 계산해야할 나머지 명령어가 남아 있다면, 스택 메모리에 그대로 함수가 기다리게 됨, 이와는 반대로 이후에 계산할게 없다면, 스택메모리에 함수를 남기지 않아도 되므로, 최적화가 가능함. 이를 꼬리 재귀함수Tail Recursion 라고 부름 꼬리 재귀 함수 Tail Recursion 꼬리 호출 제거 tail call elimination 꼬리 호출 최적화 tail calll optimization How to 재귀함수의 리턴부분에 함수 호출이 아닌 다른 연산자가 붙지 않도록 만듭니다. 컴파일러 원리 특성상, 컴파일러, 즉 사용 언어에서 지원을 해주어야 사용 가능함. C++, C#, Kotlin, Swift은 꼬리 재귀 최적화를 지원하며, Scala는 ..
반복문vs.재귀함수 정의 큰 문제를 반복 가능한 작은 문제로 나눠 푸는 방법 모든 재귀함수는 반복문으로 작성 가능 장단점 반복문 재귀함수 직관적 상대적으로 복잡함 코드가 김 코드가 짧음 가독성이 좋지 않음 가독성이 좋음 메모리를 적게 사용 메모리를 많이 사용 스택오버 플로우가 일어날 가능성이 거의 없음 호출이 너무 깊으면 스택오버 플로우 변수상태가 저장되지 않음 각 단계의 변수 상태가 자동 저장됨(함수의 스택 프레임 때문) 함수 호출 과부화가 일어남 실무 실무는 가독성이 좋고 유지보수가 좋은 코드가 좋으므로, 기본적으로 재귀함수로 작성 이런 경우 반복문의 작성(재귀함수의 단점 때문) 스택오버 플로우가 날 가능성이 있는 경우 : 피보나치 수열의 큰수를 계산해야 하는 코드 성능문제가 확인된 경우: 1초에 10만번씩 실행되어야 ..

반응형