c++ - 计算 (2^k)m=input 的递归函数

标签 c++ recursion

update2:现在它对偶数有效,但对奇数无效,当 m 为偶数时有效,而当 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 获取整数 input,k,m 并找到 mk input=( 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,并确保在一次调用成功时停止递归。

关于c++ - 计算 (2^k)m=input 的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122357/

相关文章:

java - 如何递归复制列表?

c# - 如何递归返回直接对象中 'toy' 项目的数量以及该对象的所有直接子对象

c++ - 解释器 : Handling includes/imports

c++ - 在复制构造函数和赋值运算符中删除私有(private)数组

C++ 使用类模板参数作为另一个类型的模板参数

java - Java 中的迷宫求解器问题

c++ - FFMpeg C Lib - 转置导致图像损坏

c++ - 关于vc2013中跨dll边界删除指针

c++ - 最长的多米诺骨牌链/序列

recursion - 在 COBOL 中,是否可以递归调用一个段落?