我是C的新手,并且玩弄它。所以我最终实现了fibonacci代码(迭代和递归)。我写了一个测试函数,它应该给我一个绿色(我的实现工程)或红色。它说我得到正确的返回值,但它的状态是红色的。这两个值应该都是无符号的。我编译OSX上用make比较两个相等的无符号long在C中的结果为false
#include <stdio.h>
unsigned long fibonacci(unsigned long n);
void test_fibonacci(unsigned long n, unsigned long assertion);
int main(int argc, char* argv[])
{
test_fibonacci(1, 1);
test_fibonacci(2, 1);
test_fibonacci(3, 2);
test_fibonacci(10, 55);
return 0;
}
unsigned long fibonacci(unsigned long n)
{
unsigned long result = 1;
unsigned long lastResult;
for (unsigned long i = 2; i <= n; i++)
{
// save the current result to save it as the lastResult after this iteration
unsigned long lastResultTmp = result;
result = lastResult + result;
lastResult = lastResultTmp;
}
return result;
}
void test_fibonacci(unsigned long n, unsigned long assertion)
{
printf(
"fibonacci(%lu): %lu | %s | asserted: %lu\n",
n,
fibonacci(n),
(fibonacci(n) == assertion) ? "green" : "red",
assertion
);
}
我的Makefile
CFLAGS=-Wall -g
all: main
clean:
rm -f main
rm -Rf *.dSYM
输出:
fibonacci(1): 1 | green | asserted: 1
fibonacci(2): 1 | red | asserted: 1
fibonacci(3): 2 | red | asserted: 2
fibonacci(10): 55 | red | asserted: 55
非常感谢!这是完全正确的。由于第一个斐波那契数字,我将for循环设置为3和lastResult为1。这解决了我的问题。我完全必须检查valgrind。 – noeden
@noeden当你开始时,Valgrind是一个很棒的工具。我的建议是(1)用警告设置进行编译,(2)将警告转化为错误,(3)在Valgrind中运行程序。你会惊讶你会以这种方式捕捉到多少错误。 :-) – templatetypedef
同意需要初始化'lastResult',因为不这样做会导致UB。然而,我怀疑别的东西导致OP得到“正确”的答案,但是失败的比较。 Hmmmm。 UB是UB。 - > Aha,'fibonacci()'每隔一段时间报告OP的正确答案。 – chux