【发布时间】:2022-12-06 17:56:41
【问题描述】:
int rec(int k)
{
static int temp = 0, counter = 0;
if(!k) return counter;
if(k%2 == 0){
counter++;
temp = rec(k/2);
}
if(k%2){
counter++;
temp = rec(k-1);
}
}
这个函数应该得到一个数字 k 并检查需要多少操作才能通过乘以 2 或加 1 将 k 归零。 此函数工作正常,但返回零而不是计数器中的最后一个值。我试图调试它,我看到计数器值增加,但在达到它应该返回的值后,函数向后返回以完成所有调用,并返回 0。 我通过使 counter 全局化并且不返回任何内容来修复它,但我的问题是:
有没有办法像函数内部的计数器一样修复它?
为什么这个函数最后返回零?
【问题讨论】:
-
如果
if(!k)是会发生什么不是真的?那么你的函数返回什么?请向您的rubber duck 解释。 -
另一方面,
if (k % 2 == 0) { ... } if (k % 2 != 0) { ... }(这就是您的基本条件)可以写成if (k % 2 == 0) { ... } else { ... } -
temp的目的是什么。你分配给它但你从未读过它。 -
@Someprogrammerdude,感谢您的回答,如果
if(!k)不正确,它会按预期进行。只有当 k 为 0 时,这个 if 才会返回。 -
与其浪费你自己和其他人的时间去寻找编译器已经发现的错误,你可以开始倾听编译器必须说的话:What compiler options are recommended for beginners learning C?“警告:变量'temp'已设置但未使用”,“警告: 控制到达非空函数的末尾”。为什么要感谢 gcc 先生,您在不到 1 秒的时间内发现了两个错误!