에서이 개 같은 값이있을 수 없다는 supposend 생각; (-이 코드는 이제 컴파일 업데이트)
요약 - 'decursion'(재귀가 무너지고있다) 동안 코드 폐기 결과의 마지막 두 줄 :
여기에 코드를 하나의 가능한 수정합니다.
int height_target(node* current, int data, int height)
{
int retVal = 0;
do {
if (nullptr == current)
break; // 0 indicates not found
if (current->info == data) { retVal = height; break; }
// found the node at 'height'; now de-curse
retVal = height_target (current->left, data, height+1);
if (retVal) break; // found data in left branch
retVal = height_target(current->right, data, height+1);
if(retVal) break; // found data in right branch
}while(0);
return retVal;
}
은 검색 항목은 그래서 당신의 코드는 다음 두 왼쪽 지점을 검색하고, 5 층 '최대', 가장 높은 재귀 층 (4) 5.
을 반환하도록이 데이터를 찾을 수 없습니다 발견 상상 오른쪽 가지.
두 분기 모두에서 코드가 '5'값으로 반환되면 (레이어 5에서) 코드는 단순히 결과를 무시합니다.
이 가능한 솔루션에서 나는 왼쪽 또는 오른쪽에서 돌아온 후 retVal을 테스트했습니다. 이제 반환 값 (레이어 5에서)이 0이 아닌 경우 함수는 0이 아닌 값을 반환합니다. 결과적으로 스택에서 값을 꺼내서 재귀의 맨 아래로 '뒤로'내립니다.
아마도 간단한 전화 추적은 설명 할 수는 현재 함수에 대한 모든 호출을 종료하지 않습니다
는
height_target (., ., 1); // first call, data not found at root
| height_target (., ., 2); // recursive call, data not found
| | height_target (., ., 3); // recurse, not found
| | | height_target (., ., 4); // recurse, not found
| | | | height_target (., data, 5); // found! 'decursion' begins
| | | | |
| | | | returns 5 // height 5 returns 5
| | | returns 5 // height 4 return 5
| | returns 5 // height 3 returns 5
| returns 5 // height 2 returns 5
returns 5 // height 1 returns 5
첫 번째 전화는 이제 5
StackOverflow에 오신 것을 환영합니다. 도움말 설명서의 게시 지침을 읽고 따르십시오. [최소한의 완전하고 검증 가능한 예제] (http://stackoverflow.com/help/mcve)가 여기에 적용됩니다. 코드를 게시하고 정확하게 문제를 설명하기 전까지는 효과적으로 귀하를 도울 수 없습니다. "그것은 작동하지 않습니다"충분한 문제 설명이 아닙니다. – Prune