2016-05-19 4 views
0
int countLatticePoints(std::vector<int> &point, const double &radius, const int &dimension) { 
static int count = 0;  

for(int i = -(static_cast<int>(std::floor(radius))); i <= static_cast<int>(std::floor(radius)); i++) { 
    point.push_back(i); 

    if(point.size() == dimension){ 
     if(isPointWithinSphere(point, radius)) count++; 
    }else countLatticePoints(point, radius, dimension); 

    point.pop_back(); 
} 

return count; 
} 

Я имею выше рекурсивную функцию, для которой я хотел бы, чтобы увеличить некоторые переменные, если условие isPointWithinSphere(...) верно. Мой первоначальный подход состоял в том, чтобы объявить статическую переменную с именем count, чтобы она поддерживала счет через каждый рекурсивный вызов. Хорошо, это отлично работает, когда я вызываю функцию countLatticePoints в первый раз, но теперь, если я снова вызову функцию, она добавит к предыдущему значению count, когда я сначала вызываю countLatticePoints. Я понимаю, что это происходит из-за того, как ведет себя статический классификатор. Есть ли способ, который я могу сбросить, чтобы переменная count вернулась к 0 после завершения одного вызова, прежде чем я вызову второй? Конечно, я не хочу использовать глобальные переменные, есть ли другой подход, который может работать в этой ситуации?Counting внутри рекурсивной функции

+1

Вам не нужно передавать собственные типы, как '' double' или int' как '' & сопзЬ. Константа-ссылка обычно используется для передачи больших объектов или классов – stackptr

+0

«это отлично работает, когда я вызываю функцию countLatticePoints в первый раз, но теперь, если я снова вызову функцию, она добавит к предыдущему значению счетчика, когда я впервые назвал countLatticePoints». - Если это не то поведение, которое вы хотите, ЧТО ВЫ ХОТИТЕ? После того, как fuction вызвал извне в первый раз и вернулся, что должно быть вашим счетом? После того, как он был вызван во второй раз и вернулся, какой должен быть ваш счет? – user31264

+0

@ user31264 После первого вызова это 19, второй звонок должен быть 51, но вместо этого его 19 + 51 –

ответ

2

Провод кол-во как параметр; дайте ему значение по умолчанию 0, поэтому первоначальный вызов не должен его подавать. Будет ли это для ваших нужд?

+0

В вашей ситуации он возвращает 0 для первого вызова, я уже пробовал это. –

+0

Когда вы пробовали это, вы прошли подсчет по ссылке? – 0x5453

+0

@ 0x5453 Я использую это 'int countLatticePoints (std :: vector & point, const double & radius, const int & dimension, int count = 0)' –

2

Вам не нужна статическая переменная или дополнительный параметр. Вот что вам нужно.

int countLatticePoints(std::vector<int> &point, const double &radius, const int &dimension) { 
    int count = 0; 
    const int iRadius = std::floor(radius); 
    for(int i = -iRadius; i <= iRadius; i++) { 
     point.push_back(i); 
     if(point.size() == dimension){ 
      if (isPointWithinSphere(point, radius)) 
       count++; 
     } else 
      count += countLatticePoints(point, radius, dimension); 
     point.pop_back(); 
    } 

    return count; 
} 

На боковой ноте вам не нужно передавать int или double в качестве ссылки.

1

Вы можете использовать вспомогательную функцию, чтобы выполнить то, что вы хотите, следующим образом:

void countLatticePoints(std::vector<int> &point, const double &radius, const int &dimension, int& count) { 
    const int int_radius = static_cast<int>(std::floor(radius)); 
    for(int i = -int_radius; i <= int_radius; i++) { 
     point.push_back(i); 

     if(point.size() == dimension){ 
      if(isPointWithinSphere(point, radius)) count++; 
     }else countLatticePoints(point, radius, dimension, count); 

     point.pop_back(); 
    } 
} 

int countLatticePoints(std::vector<int> &point, const double &radius, const int &dimension) { 
    int count = 0;  
    countLatticePoints(point, radius, dimension, count); 
    return count; 
}