Количество дополнений в рекурсивной функции без использования глобальных переменных в c ++ - PullRequest
0 голосов
/ 06 декабря 2018

Мне нужно реализовать счетчик, который подсчитывает количество дополнений в этой рекурсивной функции, но мне не разрешено использовать глобальные переменные.Ты знаешь как это сделать?Например, если функция должна сама вызывать свободные времена, мой счетчик должен быть установлен на три в конце функции непосредственно перед возвратом.

long lindh(unsigned int n) {

  long lin = 0;
  if (n == 1 || n == 2) {
    lin = 1;
  } else {
    lin = 1 * lindh(n - 1) + 3 * lindh(n - 2);
  }

  return lin;
}

int main() {
  long b = 0;
  b = lindh(24);

  cout << "lindhauer " << b << endl;

  return 0;
}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы можете определить перегруженную функцию lindh, которая принимает два аргумента.Перегруженная функция принимает два параметра, в то время как версия, вызываемая из main, является «базовой» функцией, которая просто делегирует перегруженной функции.

Кроме того, поскольку вам необходимо вернуть значение lin иcount, вы можете вернуть std::pair<long, int> для обозначения значения lin и счетчика.Это устраняет необходимость в глобальной переменной

. Вот пример:

#include <utility>
#include <iostream>


long lindh(unsigned int n, int &count) 
{
  long lin = 0;
  if (n == 1 || n == 2) {
    lin = 1;
  } else {
    ++count;
    lin = 1 * lindh(n - 1, count) + 3 * lindh(n - 2, count);
  }
  return lin;
}

std::pair<long,int> lindh(unsigned int n) 
{  
   int count = 0;
   return {lindh(n, count), count};
} 

int main() 
{
   auto b = lindh(24);
   std::cout << "lindhauer = " << b.first << "\ncount = " << b.second << std::endl;
}

Живой пример

0 голосов
/ 06 декабря 2018

Вы можете изменить сигнатуру функции на:

long lindh(unsigned int n, int &count) 

Передайте ей переменную, в которой вы хотите, чтобы счетчик заканчивался, как при первом вызове, так и при каждом рекурсивном.Приращение count в соответствующих местах.

...