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

recursive function to calculate (2^k)m=input

本文关键字:输入 计算 递归函数      更新时间:2023-10-16

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不小于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,而我只想在一开始就初始化它们。。。

非常感谢您的帮助

如果您不能更改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,并确保如果一个调用成功,我们将停止递归。