我是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