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并查找m
和k
输入=(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,而我只是希望它们在开始时初始化...
非常感谢您的帮助
答案 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);
}