2012-09-14 4 views
3

재귀 호출에서 함수의 순서를 검색하는 가장 쉬운 방법은 무엇입니까? 예를 들어, 재귀 함수가있는 경우, 기본 케이스를 찾을 때까지 자체 호출을 계속 한 다음 한 번에 하나의 함수를 반환합니다. 반환되는 첫 번째 함수의 순서는 0이고 두 번째 함수의 순서는 1입니다. 등 ... 주문 정보를 검색하는 쉬운 방법은 무엇입니까? 예를 들어 주문 3의 기능 일 때 특별한 것을하고 싶습니다.재귀 호출에서 함수의 순서 번호 얻기

편집 : 스택의 맨 위에있는 기능을 0으로 설정합니다.

Edit2 : 해결하기 위해 노력하고있는 문제는 이진 트리 탐색 순서의 n 번째 요소를 반환하는 것입니다.

+0

재미 있고 흥미로운 사운드를 제공 할 수 있습니까? – Pao

+0

매개 변수를 사용하여 각 호출에 대해 증가하는 인수를 전달하거나 전체를 반복적으로 수행합니다. 재귀 트리의 각 노드에서 깊이를 원하는 것처럼 들립니다. – oldrinb

+0

탐색 된 트리에서 'nth' 요소를 찾으려면 각 재귀 호출의 * 및 *에 a 카운터를 전달하십시오. 형제 자매는 이전 형제를 횡단 한 결과 카운터에 공급됩니다. –

답변

5

이이

void recursive(int p1, String p2, long p3) { 
    ... 
    if (someCondition) { 
     recursive(nextP1, nextP2, nextP3); 
    } 
} 

변화 그것과 같은 재귀 함수로 시작하는 경우 :

void recursive(int p1, String p2, long p3, int level) { 
    ... 
    if (someCondition) { 
     recursive(nextP1, nextP2, nextP3, level+1); 
    } 
} 

이제

recursive(initialP1, initialP2, initialP3, 0); 
를 호출하여 제로 레벨을 시작하세요

levelrecursive의 호출 수를 나타냅니다. 너 위에.

편집 : 당신은 또한 "상단 제로"를 구현하기 위해 수준을 반환하는 기능을 변환 할 수 있습니다

(-에 - 더 - 상단 영) 전략 :

int recursive(int p1, String p2, long p3) { 
    if (baseCase) { 
     return 0; 
    } 
    ... 
    int level = 0; 
    if (someCondition) { 
     level = 1+recursive(nextP1, nextP2, nextP3); 
    } 
    return level; 
} 

주 이 경우 마지막 재귀 호출이 반환 될 때까지는 level을 찾을 수 없습니다. 레벨 0은 마지막으로 "중첩 된 호출"을해야하는 경우가 단지 3 이상의 중첩 호출 후 "말할 수 없기 때문에

+0

이것을 덧붙이면 원래의 재귀 함수를 유지하고 추가 매개 변수로 새 함수를 호출 할 수 있습니다. 이런 식으로 호출자 (예 :'main()')는 차이점을 알지 못합니다. –

+0

흥미 롭습니다. 따라서 가장 깊은 함수 (스택 맨 위에있는 함수)를 0으로 만들려면 어떻게해야합니까? – Keeto

+0

@Keeto 다음 호출이 반환 될 때까지 (그 중 얼마나 많은 숫자가 될지 모르기 때문에) 레벨이 "0"인 항목을 알 수 없습니다. 이전 호출에서 레벨을 리턴하고 레벨을 학습하기 위해 레벨을 추가 할 수 있지만, "사실 이후"에서만이를 수행 할 수 있습니다. – dasblinkenlight

0
  • 은, 그것은 일반적으로 결정 불가능한 문제에 중단 문제와 유사하다는 함수는 값을 반환합니다 ". 특정 기능의 계산을 으로 시뮬레이션함으로써 만 앞을 내다 볼 수 있습니다.

  • 수준 0이 첫 번째 호출이어야한다면 매우 간단하며 수준을 메서드의 param으로 사용하고 증분 할 수 있습니다.

BTW, 흥미로운 문제, 사례 dasblink 당신이 구현 현명한 당신은 재귀에 깊은 가서 레벨 카운터 (증가)을 상승하기 때문에 어떤 제안의 반대를 커버 제공하고있다 http://en.wikipedia.org/wiki/Halting_problem

3

를 참조하십시오.

정확한 재귀 깊이를 미리 알 수있는 재귀에서 더 깊어 질수록 감소 시키길 원할 경우.

대부분의 경우 재귀를 사용하지 않을 정확한 재귀 수준을 알고있는 경우 루프를 사용합니다 (for, while, repeat/until 등). 사실 이러한 경우에 재귀를 사용하는 것은 재 할당 스택이 할당되고 (높은 메모리 소비) 루프가 훨씬 효율적이기 때문에 덜 적합합니다.

+0

+1 "대부분의 경우 정확히 재귀 깊이를 알고 있다면 재귀를 사용하지 않을 것입니다"이것은 완벽한 관찰입니다! – dasblinkenlight

+0

대부분의 경우 재귀 함수를 사용하는 것이 문법적으로 더 깔끔합니다. 그리고 그 코드를 재사용 할 필요가 있다면 어쨌든 대부분의 사람들 (때로는 나 자신을 포함하여)이 zagged했을 때 zig 할 수 있도록 함수를 작성하게 될 것입니다. –

+1

재귀 함수를 사용하면 스택 오버플로가 쉽게 끝날 수 있습니다. 스택을 -ss Stacksize 또는 -oss Stacksize로 늘릴 수 있습니다. 그러나 각 메소드 호출은 오버 헤드를 의미하며 재귀가 깊어지기를 기대한다면 분명히 피해야하는 것입니다. –