2010-07-06 5 views
0

재귀 - 언제 사용 하시겠습니까? 사용하지 않으시겠습니까?재귀 - 언제 사용 하시겠습니까? 사용하지 않을 때는

+14

재귀를 사용하는 경우를 이해하려면 재귀를 사용해야하는 시점을 이해해야합니다. :) – btreat

+1

당신은 당신이 abotu를 궁금하게 생각하고 있거나 단지 막연한 일반적인 질문 일뿐입니다. – Chris

+0

소련 러시아에서는 재귀가 당신을 사용합니다! – Jukebox

답변

2

문제가 쉽게 생기고 큰 스택 메모리가있는 경우 (큰 스택의 경우) 사용합니다.

스택 메모리가 프리미엄 상태 인 경우 호출 스택이 너무 커지지 않으므로 오버플로가 발생하고 응용 프로그램이 실패하게됩니다.

+0

참고 [언제 스택 크기에 대해 걱정합니까?] (http://stackoverflow.com/questions/1915900) – ChrisW

+0

나는 그것이 ** 메모리 ** 일반적으로 메모리가 아니라 여기에 대해 이야기하고 있음을 분명히 밝힙니다. . 꼬리 전화를 걸고 최근 CLR에서 실행중인 경우에도 그 차이가있을 수 있습니다. –

+0

사실 나는 당신에게 upvote를 줄 것이지만, 문제가 더 쉽게 될 때 말하지 않는다는 점에서 아마도 도움이되지 않을 것이다. 또한 심층 재귀 문제는 일반적으로 스택이 너무 커져서 성능 문제가 발생하는 것은 아니지만 스택 오버플로가 발생하여 프로그램이 실패합니다. – Jay

9

재귀가 필요한 problem가 발생할 때마다 recursion을 사용합니다.

+0

왜 이것에 다운 보트가 있습니까? – Cam

+0

유머 감각이없는 사람. +1. –

+6

@incrediman 나는 그것이 피곤한 농담이고, (그리고 최악의 경우, OP에게 불쾌한) 도움이되지 않았다고 생각했기 때문에 나는 그것을 떨어 뜨렸다. – ChrisW

2

매우 언어에 의존합니다. 아주 좋은 꼬리 호출 최적화가없는 Ruby와 같은 언어에는 매우 조심하십시오. 진정한 함수형 언어는 재귀를보다 잘 처리합니다. 너무 많이 의존하기 전에 memoization에 대해 알고 있어야합니다. 내가 실제로 사용하는 곳은 입력과 출력의 전체 범위를 알고있을 때입니다. 내가 100 번이나 깊이 갈 수 없을 것이라는 것을 안다면 적어도 (루비에서는) 그것을 사용할 것이다. 그렇지 않으면 나는 다른 패턴을 발견한다. 재귀가 빨라 졌으면 좋겠어요. 왜냐하면 너무 자주 내가 사랑하는 정말로 깔끔한 2 행 솔루션을 찾을 수 있기 때문입니다. 그러나 그것은 안정적으로 또는 신속하게 수행되지 않으므로 대체해야 할 것입니다.

+0

바, 물론 아담. 고마워. 고마워. – zachaysan

-1

분명히 올바른 해결책이었고 다른 방법이 정확할 수있는 경우에만 사용했습니다.

아마도 계승 함수의 경우일지도 모르지만. 당신은 재귀에 의해 분명히 풀 수있는 일이 매우 빠르게 아주 추악한 성장할 수있는 방법의 예를 원하는 경우 Fibonnaci 순서

f(n) = f(n - 1) + f(n - 2), f(0) = f(1) = 1 

을보십시오.

+3

경우에만? 분명히 기능적 언어로 프로그래밍 한 적이 없습니다. –

+1

그는 아마도 재귀를 사용하지 않을 것이라는 것을 의미했습니다 ... –

+1

"다른 방법이 가능하지 않을 수 있습니까?" 그것은 말하기에 절대적으로 바보 같은 짓입니다. 반복적 인 접근법으로는 해결할 수없는 재귀를 사용하여 해결할 수있는 문제를 생각할 수 없습니다. –

5

일반적으로 tree 데이터 구조로 문제를 개념화 할 수 있으면 재귀를 사용하여 트리를 탐색 할 수 있습니다.

+0

재귀는 실제로 선형이 아닌 실제로 나무 구조 인 경우 매우 빨리 폭발 할 것입니다. – apoorv020

+3

당신은 틀린 나무 thar에 연결합니다. 이것을 시도하십시오 : http://en.wikipedia.org/wiki/Tree_%28data_structure%29 – WCWedin

+0

@ apoorv020 : 꼭 그런 것은 아닙니다. 균형 이진 트리의 최대 깊이는 노드 수의 로그 N 일 뿐이며 재귀 알고리즘은 그 이상의 스택 공간이 필요하지 않다는 것을 기억하십시오. –

0

귀하의 언어/환경이 호출 스택 깊이에 제한이있는 경우이를 사용하지 않을 것입니다. Lotus Notes의 초기 버전을 사용하여 16 레벨 이하의 제한이 있었는데 거의 재귀를 사용할 수 없게되었습니다.

+0

로터스 노츠 (Lotus Notes)가 가장 중요한 케이스라고 생각합니다. 재귀 사용에 대한 논쟁이라고보기는 어렵습니다. 모든 환경에는 스택 깊이의 제한이 있습니다. –

관련 문제