как считать в рекурсивной функции?

Вот мой код для печати делителей, а затем количество делителей данного числа.

Теперь предположим, что я беру 2 тестовых случая: 5 и 8; этот код дает счет 5 как 2 и 8 как 6 (то есть он добавляет предыдущий счет).

Даже если я объявлю это как int count = 0; он возвращает тот же результат.

Другая проблема возникает, когда я заявляю int count = 0 внутренняя функция factors,

Код дает счет как 0 для всех случаев.

#include<iostream>
using namespace std;
int count;
long long factors(long n, long f=1)
{if(n%f==0) {
cout << f << endl;
count++;
}

if(f==n) {
return 0;
}

factors(n,f+1);

return count;

}

int main()
{
int n;
int t;
cin >> t;
while(t--)
{
cin >> n;
cout << factors(n) << endl;
}return 0;
}

3

Решение

Использование глобалов обычно не очень хорошая идея. Это особенно плохо в рекурсивных функциях, которые предпочтительно должны быть реентерабельными. Конечно, вы можете исправить свою функцию, сбросив счетчик в цикле, например так:

while(t--)
{
cin>>n;
count = 0; // Reset count before the recursive call
cout << factors(n) << endl;
}

Вы также можете сделать factors «обертка», которая сбрасывает count освободить абонентов от необходимости сброса count перед звонком factors, как это:

long long factors(long n) {
count = 0;
return factors(n, 1);
}
long long factors(long n,long f /* Remove the default */) {
... // the rest of your code
}
1

Другие решения

Вы можете достичь этого, передав счет в качестве ссылки —

#include<iostream>
using namespace std;

long long factors(long n, int& count, long f=1)
{
if(n%f==0)
{
cout<<f<<endl;
count = count + 1;
}

if(f==n)
return 0;

factors(n, count, f+1);
return 0;
}

int main()
{
int n,t;
cin>>t;
while(t--)
{
cin>>n;
int count = 0;
factors(n, count);
cout << count << endl;
}
return 0;
}

-Gaurav

1

Во-первых, почему вы объявляете переменную count в глобальном пространстве?

Во-вторых, вы не можете выполнять арифметические операции с необъявленной переменной (в этом случае int «count» никогда не объявляется).

В-третьих, почему вы создаете бесконечный цикл, выполняя while (t—)?

Вы сказали, что функция дает 0 для всех входных данных,
Может ли это быть из-за того, что счет никогда не объявляется?

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector