如何计算递归函数?

时间:2013-11-02 17:54:59

标签: c++ recursion factors

这是我打印除数的代码,然后是给定数字的除数。

现在假设我接受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 个答案:

答案 0 :(得分:1)

使用全局变量通常不是一个好主意。它在递归函数中尤其糟糕,它最好是可重入的。当然,您可以通过重置循环中的计数来修复您的功能,如下所示:

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 :(得分: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

答案 2 :(得分:0)

首先,为什么要在全局空间中声明count变量?

其次,您不能对未声明的变量执行算术运算(在这种情况下,int“count”永远不会被声明)。

第三,为什么要通过while(t - )来创建无限循环?

你说这个函数让你为所有输入计数为0, 这可能是由于计数从未被宣布过吗?