2012-12-11 4 views
0

배열의 int를 팝하는 코드 줄이 int element에 저장되고 배열에서 제거됩니다. return 문에서 CountCriticalVotes(rest, blockIndex + element);을 반환하면 blockIndex 변수에 전달되고 배열이 비어지기 전에 10에 도달하면 1을 반환합니다.하지만 내 문제는 배열의 모든 값을 매개 변수를 추가하지만 매개 변수 값을 원래 상태로 되 돌린 다음 새 매개 변수 값을 다시 추가하십시오. 어떻게해야합니까?재귀 : 매개 변수로 전달 된 값을 사용합니다.

int NumCriticalVotes :: CountCriticalVotes(Vector<int> & blocks, int blockIndex) 
{ 
    if (blockIndex >= 10) 
    { 
     return 1; 
    } 
    if (blocks.isEmpty()) 
    { 
     return 0; 


    } else { 

     int element = blocks.get(0); 
     Vector<int> rest = blocks; 
     rest.remove(0); 
     return CountCriticalVotes(rest, blockIndex + element); 
+1

이 재귀해야 하는가를? –

+0

예! 나는 재귀를 배우기의 일환으로하고있다. –

+0

이것은 당신에게 질문에 답하지 않을 수도 있지만, 문제는 불필요하게 보이는 블록 벡터를 수정하지 않고 이것을 할 수 있어야한다. 당신은'Vector const & blocks'로 넘겨 줄 수 있습니다. –

답변

1

(그런데 매우 비효율적이 작업을 수행하는 이유.) 재귀 적으로 그 일을하지 :

bool NumCriticalVotes :: CountCriticalVotes(Vector<int> const& blocks, 
              int blockIndex, 
              size_t current = 0) 
{ 
    // check if we reach the end of the vector 
    if (current == block.size()) 
    { 
     return true; 
    } 

    int sum = blockIndex+block.get(current); 

    if (sum >= 10) 
    { 
     return true; 
    } 

    return CountCriticalVotes(blocks, blockIndex, current+1); 
} 
0

은 어쩌면 내가 잘못 이해하지만 왜 그냥이 기능에 또 다른 인수를 추가하지 : blocks의 현재 위치의 인덱스를. 이렇게하면 벡터, 임시 벡터 등이 아닌 요소를 제거 할 필요가 없습니다.

1

중요 투표를 계산할 수 있도록 코드를 수정 한 다음 요소를 목록의 맨 앞으로 다시 밀어 넣을 수 있습니다. 그것은 다음과 같이 보일 것입니다 :

blocks.remove(0); 
int votes = CountCriticalVotes(blocks, blockIndex + element); 
blocks.push_front(element); 
return votes; 

초기 함수 호출이 완료된 후에 만 ​​복귀됩니다 때문, 정확하게 당신이 원하는 일을하지 않지만, 최종 결과는 동일합니다.

1

재귀 호출을하면 인덱스 1에서 끝까지의 모든 요소로 구성된 임시 벡터를 전달할 수 있습니다. 원래 벡터는 변경되지 않습니다. 이렇게하면 여러 가지 임시 벡터가 만들어 지지만 원본 코드는 생성됩니다. 다음은 예제를 기반으로 한 간단한 코드 샘플입니다.

#include <iostream> 
#include <vector> 
using namespace std; 

bool CountCriticalVotes(vector<int>& blocks, int sum = 0) { 
    if (sum >= 10) { 
     return true; 
    } else if(blocks.empty()) { 
     return false; 
    } else { 
     vector<int> temp(blocks.begin() + 1, blocks.end()); 
     return CountCriticalVotes(temp, sum + blocks.at(0)); 
    } 
} 

int main() { 
    vector<int> foo = { 2, 3, 4, 5, 6}; 
    vector<int> bar = { 2, 3 }; 
    cout << boolalpha << CountCriticalVotes(foo) << endl; 
    cout << boolalpha << CountCriticalVotes(bar) << endl;  
} 
관련 문제