Ich bin neu in C und spiele damit herum. Also habe ich den Fibonacci-Code implementiert (iterativ und rekursiv). Ich habe eine Testfunktion geschrieben, die mir eine grün (meine Umsetzung funktioniert) oder rot geben soll. Es sagt, dass ich den richtigen Rückgabewert bekomme, aber der Status ist rot. Die beiden Werte sollten beide vorzeichenlos lang sein. Ich bin Kompilieren auf OSX mit MakeVergleicht man zwei gleich lange vorzeichenlose Länge in C ergibt sich als falsch
#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
);
}
Mein Makefile
CFLAGS=-Wall -g
all: main
clean:
rm -f main
rm -Rf *.dSYM
Ausgang:
fibonacci(1): 1 | green | asserted: 1
fibonacci(2): 1 | red | asserted: 1
fibonacci(3): 2 | red | asserted: 2
fibonacci(10): 55 | red | asserted: 55
Vielen Dank! Das ist völlig richtig. Ich setze i wegen der ersten Fibonacci-Zahlen in der for-Schleife auf 3 und lastResult auf 1. Das löst meine Probleme. Ich muss Valgrind total überprüfen. – noeden
@noeden Valgrind ist ein wunderbares Werkzeug, wenn Sie anfangen. Meine Empfehlung ist (1) kompilieren mit Warneinstellungen bis ganz nach oben, (2) Warnungen in Fehler verwandeln, und (3) Programme in Valgrind ausführen. Sie wären erstaunt, wie viele Fehler Sie auf diese Weise bekommen. :-) – templatetypedef
Stimmen Sie der Notwendigkeit zu, 'lastResult' zu initialisieren, da dies nicht zu UB führt. Dennoch bin ich misstrauisch, dass etwas anderes OP dazu brachte, die "richtigen" Antworten zu bekommen, aber schade, vergleiche es. Hmmmm. UB ist UB. -> Aha, 'fibonacci()' hat die richtige Antwort jedes Mal für OP gemeldet. – chux