递归函数计算(2 ^ k)m =输入

时间:2015-12-06 20:31:22

标签: c++ recursion

update2 :现在它适用于偶数但是奇怪的是它不起作用,当m是偶数时它起作用,当它奇怪时它不起作用。

void find2Factor(int num, int& k, int& m)
{
    if (num % 2 == 1)
        m = num;
    else
        m = num - 1;
    k = 1;
    fin2FactorRec(num, k, m);
}

void fin2FactorRec(int num, int& k, int& m)
{
    if (m*k == num)
    {
        k = powerof2(k);
        return;
    }
    else if (num%m==0)
        fin2FactorRec(num, k *= 2, m);
    else
        fin2FactorRec(num, k, m -= 2);
}

int powerof2(int n)
{
    int count = 1;
    while (n != 2)
    {
        n /= 2;
        count++;
    }
    return count;
}

update1 :编辑到以下但是第一次递归时却停留在第二次递归中,并且没有进入第二次递归。

void find2Factor(int num, int& k, int& m)
{
    k = m = 1;
    fin2FactorRec(num, k, m);
}

void fin2FactorRec(int num, int& k, int& m)
{
    if (k*m == num)
        return;
    if (num == m)
        return;
    else
    {
        find2Factorrec(num, k, m += 2);
        find2Factorrec(num, k *= 2, m);
    }
}

我想编写一个函数find2Factor来获取整数输入,k,m并查找mk输入=(2 ^ k)* m而k isn& #39; t小于0(k可以为0) m是奇数。

这是我必须使用的代码而不改变:

int main() {

    int num, k, m;

    cin >> num;

    find2Factor(num, k, m);

    cout << k << " " << m << endl;
}

所以这就是我写函数find2Factor

的方式
void find2Factor(int num, int& k, int& m)
{
    k = m = 0;
    if (k*m == num)
        return;
    if (num == m)
        return;
    else
    {
        find2Factor(num, k, m += 2);
        find2Factor(num, k*2, m);
    }
}

但它始终初始化k和m,而我只是希望它们在开始时初始化...

非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果你不能改变main,那么你将需要一个设置功能和一个递归函数。

否则,在调用find2Factor之前初始化main中的m和k。

评论后修改:

第二个电话不起作用,因为m和k已经大于它们的限制。

使用递归时,我更喜欢按值传递参数,因为从不成功的调用返回时,它可以更容易地将它们恢复到以前的值。函数签名可能如下所示:

bool internalFind2Factor(int num, int k, int k_pow, int m, int& res_k, int& res_m)

如果返回的值表示成功,则k_pow将保持2 ** k,res_k和res_m将包含成功时的答案。

我还会尝试在不同的代码路径中递增增量k和m,并确保在一次调用成功时停止递归。

答案 1 :(得分:0)

您不需要递归:

// assume num > 0
void find2Factor (int num, int& k, int& m)
{
    k = 0;
    m = num;

    while (m % 2 == 0) {
        k++;
        m /= 2;
    }
}

但是,如果您被迫使用它,则可以通过使用递归调用替换循环,轻松地将非递归解决方案转换为递归解决方案:

void reduce (int& k, int& m)
{
    if (m % 2 == 0) {
        k++;
        m /= 2;
        reduce (k, m);
    }
}

// assume num > 0
void find2Factor (int num, int& k, int& m)
{
    k = 0;
    m = num;

    reduce (k, m);
}